2009-06-12 8 views
7

J'utilise la bibliothèque python-smbc sur Ubuntu pour accéder à un partage samba. Je peux très bien accéder à la structure du répertoire, mais je ne suis pas sûr de savoir comment accéder aux fichiers réels et à leur contenu. La page Web (https://fedorahosted.org/pysmbc/) ne mentionne rien, le code est en C/C++, avec peu de documentation, donc je ne suis pas très sûr de savoir comment l'utiliser. Ce que je sais, c'est que Context.open (pour les fichiers) prend uri, flags et mode, mais je ne sais pas quels sont les drapeaux et les modes.Utiliser pysmbc pour lire des fichiers sur samba

Est-ce que quelqu'un a utilisé cette bibliothèque, ou a des exemples sur la façon de lire les fichiers qui l'utilisent?

La situation idéale était bien sûr d'utiliser des montages smbfs, mais lorsque je monte le même partage en utilisant smbmount, tous les dossiers sont vides. Bien que je peux le parcourir avec smbclient bien en utilisant les mêmes informations d'identification.

Répondre

-3

Je voudrais rester avec smbfs. Ce n'est qu'une question de temps avant de vouloir accéder à ces fichiers partagés avec autre chose que Python.

+2

Je pense que nous devrions au moins essayer de répondre la question ... –

11

J'ai également eu du mal à utiliser smbfs (verrouillages et redémarrages aléatoires du système) et j'avais besoin d'une réponse rapide.

J'ai également essayé le module smbc mais je n'ai pas pu obtenir de données avec. Je suis allé aussi loin que l'accès à la structure du répertoire, tout comme vous.

temps était écoulé et je devais livrer le code, donc je pris un raccourci:

j'ai écrit un petit wrapper autour d'un appel « smbclient ». C'est un hack, laid, vraiment moche, mais cela fonctionne pour mes besoins. Il est utilisé en production sur l'entreprise que je travaille.

Voici quelques exemple d'utilisation:

>>> smb = smbclient.SambaClient(server="MYSERVER", share="MYSHARE", 
           username='foo', password='bar', domain='baz') 
>>> print smb.listdir(u"/") 
[u'file1.txt', u'file2.txt'] 
>>> f = smb.open('/file1.txt') 
>>> data = f.read() 
>>> f.close() 
>>> smb.rename(u'/file1.txt', u'/file1.old') 

Le programmeur avant moi était d'un fichier « bash » avec beaucoup d'appels smbclient, donc je pense que ma solution est au moins mieux.

Je l'ai téléchargé here, alors vous pouvez l'utiliser si vous le souhaitez. Le référentiel Bitbucket est here. Si vous trouvez une meilleure solution, dites-le moi et je remplacerai mon code aussi.

+0

Salut monsieur, c'est bon module, mais ne fonctionne pas en Python 2.6.8 et en dessous –

+0

@RahulPatil comment est-il échouer? Je l'utilise sur python 2.4 et 2.5 ici en production et ça marche. Pouvez-vous ouvrir un problème à l'issue tracker et décrivez l'erreur que vous obtenez ici: https://bitbucket.org/nosklo/pysmbclient/issues/new – nosklo

+1

mec votre emballage flipping rocks je l'aime génial! –

3

Pourvu que vous avez un contexte ouvert (voir les tests unitaires ici)
* https://github.com/ioggstream/pysmbc/tree/master/tests

suri = 'smb://' + settings.SERVER + '/' + settings.SHARE + '/test.dat' 
dpath = '/tmp/destination.out' 

# open smbc uri 
sfile = ctx.open(suri, os.O_RDONLY) 

# open local target where to copy file 
dfile = open(dpath, 'wb') 

#copy file and flush 
dfile.write(sfile.read()) 
dfile.flush() 

#close both files 
sfile.close()  
dfile.close() 

Pour ouvrir un contexte de définir simplement une fonction d'authentification

ctx = smbc.Context() 

def auth_fn(server, share, workgroup, username, password): 
    return (workgroup, settings.USERNAME, settings.PASSWORD) 

ctx.optionNoAutoAnonymousLogin = True 
ctx.functionAuthData = auth_fn 
+0

J'avais juste besoin d'une chose simple et c'est tout. Merci –

1

Si vous avez réussi à obtenir la structure du répertoire, alors vous avez un contexte de travail. La clé pour accéder réellement aux fichiers est l'argument flags non documenté de Context.open. (Je n'ai pas trouvé quel est le mode pour l'un ou l'autre mais cela ne semble pas nécessaire.)

flags est comment vous dites à pysmbc quel type d'accès au fichier que vous voulez. Vous le faites en lui passant un entier fait par des drapeaux ORing bit à bit (|) du module os ensemble. Spécifiquement les drapeaux que vous voulez ou avec le suffixe os.O_ (voir une liste dans la documentation Python here).

Par exemple, pour écrire dans un fichier, vous devez définir des drapeaux pour os.O_WRONLY (equiavlent à l'aide "w" comme paramètre de mode de la construction dans open fonction) et à ajouter à un fichier qui pourrait déjà exister utiliser os.O_WRONLY | os.O_APPEND | os.O_CREAT (équivalent à "a+"). Cet appel renvoie alors un objet file que vous pouvez utiliser comme n'importe quel fichier local normal.

2

Si vous ne savez pas si cela est plus clairement, mais voici ce que je glanées cette page et réglait d'un petit Google-ing supplémentaire:

def do_auth (server, share, workgroup, username, password): 
    return ('MYDOMAIN', 'myacct', 'mypassword') 


# Create the context 
ctx = smbc.Context (auth_fn=do_auth) 
destfile = "myfile.txt" 
source = open('/home/myuser/textfile.txt', 'r') 
# open a SMB/CIFS file and write to it 
file = ctx.open ('smb://server/share/folder/'+destfile, os.O_CREAT | os.O_WRONLY) 
for line in source: 
     file.write (line) 
file.close() 
source.close() 

# open a SMB/CIFS file and read it to a local file 
source = ctx.open ('smb://server/share/folder/'+destfile, os.O_RDONLY) 
destfile = "/home/myuser/textfile.txt" 
fle = open(destfile, 'w') 
for line in source: 
     file.write (line) 
file.close() 
source.close() 
+0

Pouvez-vous expliquer plus comment cela répond à la question? – Laurel

Questions connexes