2009-06-12 11 views
7

私はsamba共有にアクセスするために、Ubuntu上でpython-smbcライブラリを使用しています。私はディレクトリ構造を細かくアクセスすることができますが、実際のファイルとその内容にアクセスする方法はわかりません。 Webページ(https://fedorahosted.org/pysmbc/)には何も言及されていません。コードはC/C++で書かれているため、ほとんど使用していません。pysmbcを使ってsamba上のファイルを読む

私が知っているのは、Context.open(ファイル用)にはuri、flags、modeが必要ですが、フラグとモードは何か分かりません。

誰でもこのライブラリを使用していますか、それを使用してファイルを読む方法の例はありますか?

理想的な状況はもちろんsmbfsマウントを使用していましたが、smbmountを使用して同じ共有をマウントすると、すべてのフォルダが空になります。私は同じ資格情報を使ってsmbclient fineでブラウズできます。

答えて

-3

私はsmbfsを使用します。これらの共有ファイルにPython以外のものでアクセスしたいときは、時間の問題です。

+2

私たちは、少なくとも答えにしようとすべきだと思います質問... –

11

また、smbfs(ランダムシステムのロックダウンと再起動)の使用に問題があり、迅速な対応が必要でした。

私もsmbcモジュールを試しましたが、データを取得できませんでした。あなたと同じように、ディレクトリ構造にアクセスするだけです。

時間がアップだったと私は、コードを提供しなければならなかったので、私はショートカットを取っ:

私は「​​」コールの周りに小さなラッパーを書きました。それはホック、醜い、本当に醜いです、それは私のニーズのために動作します。それは私が働く会社の生産に使用されています。

は、ここではいくつかの使用例です:私の前に

>>> 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') 

プログラマはので、私は私の解決策は、少なくとも優れていると思う 、smbclientの呼び出しの多くが付いている「bashの」ファイルを使用していました。

私はhereをアップロードしましたので、必要に応じて使用できます。 Bitbucketリポジトリはhereです。より良い解決策を見つけたら教えてください。私も自分のコードを置き換えます。あなたはあなたが管理している場合は、単に認証機能に

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

こんにちは、良いモジュールですが、Python 2.6.8以降で動作していません –

+0

@RahulPatilどのように失敗していますか?私はPython 2.4と2.5で本番環境で使用しています。問題トラッカーで問題を開いて、ここに来ているエラーを説明できますか:https://bitbucket.org/nosklo/pysmbclient/issues/new – nosklo

+1

あなたのラッパーを反転させる教えてください。私はそれをすごく気に入っています! –

3

ディレクトリ構造を取得して、作業コンテキストを取得します。実際にファイルにアクセスするための鍵は、文書化されていないフラグ引数Context.openです。 (どのモードがどちらのモードであるかはわかりませんが、それは必要ないように見えます)

flagsどのようにしてファイルへのアクセスを希望しますか?これを行うには、osモジュールからのビット単位のOR(|)フラグを整数に渡します。具体的には、os.O_を使用したい(またはPythonのマニュアルhereのリストを参照してください)。

たとえば、あなたが(open機能に建てられたのmodeパラメータとして"w"を使用してequiavlent)os.O_WRONLYにフラグを設定しますと、すでに"a+"からos.O_WRONLY | os.O_APPEND | os.O_CREAT(等価を使用して存在する可能性があるファイルに追加したファイルに書き込みます)。

この呼び出しでは、通常のローカルファイルと同様に使用できるfileオブジェクトが返されます。

+0

私はちょうど簡単なことが必要で、これはそれだけです。ありがとうございます –

1

を定義するコンテキストを開くには、オープンコンテキスト(ここではユニットテストを参照してください)
* 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() 

を持って提供

2

これはより明確に述べたが、ここで私は、このページから収集し、少し余分なGoogleの-INGから選別何されている場合わからない場合:

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

これがどのようにしてこの質問に答えるかをもっと説明できますか? – Laurel

関連する問題