2018/4/23 追記
より詳細な使い方の記事を書きました。
pysmbの使い方(接続・切断)
pysmbの使い方(ファイル受信)
pysmbの使い方(ファイル送信)
pysmbの使い方(ロギング)
pythonでWindows共有フォルダへアクセスしたい場合、
pysmbパッケージを使用しsambaで接続する。
http://pysmb.readthedocs.io/en/latest/index.html
##実行環境
python 3.5.3
pysmb 1.1.19
##インストール
pipでインストールする。
pip install pysmb
##使い方
###ファイルリストの取得
\\<ip_address>\temp\a\b\c
のファイルリストを取得する場合
samba_test.py
# !/usr/bin/env python
# coding:utf-8
import platform
from smb.SMBConnection import SMBConnection
if __name__ == "__main__":
# connection open
conn = SMBConnection(
'<user>',
'<password>',
platform.uname().node,
'<remote_hostname>',
domain='WORKGROUP',
use_ntlm_v2=True)
conn.connect('<ip_address>', 139)
items = conn.listPath('temp', 'a/b/c')
print([item.filename for item in items])
conn.close()
- itemsへはSharedFileクラスのリストが返される。
- tempおよびa/b/cが存在しない場合は当然エラーとなる。
- domainは指定しなくても繋がるよう、domain=''でもOK
###ファイルの取得
\\<ip_address>\temp\a\b\c\hoge.txt
を/var/hoge
として保存する。
samba_test.py
# !/usr/bin/env python
# coding:utf-8
""" samba_test.py """
import platform
from smb.SMBConnection import SMBConnection
if __name__ == "__main__":
# connection open
conn = SMBConnection(
'<user>',
'<password>',
platform.uname().node,
'<remote_hostname>',
domain='WORKGROUP',
use_ntlm_v2=True)
conn.connect('<ip_address>', 139)
with open('/var/hoge', 'wb') as file:
conn.retrieveFile('temp', 'a/b/c/hoge.txt', file)
conn.close()
-
ファイル自体は不要で、中身だけ知りたい場合はBytesIOを使う
samba_test.pyimport io with io.BytesIO() as file: conn.retrieveFile('temp', 'a/b/c/hoge.txt', file) file.seek(0) print([line.decode() for line in file])
###ファイルを送る
/var/hoge
を\\<ip_address>\temp\a\b\c\hoge.txt
として保存する。
samba_test.py
# !/usr/bin/env python
# coding:utf-8
""" samba_test.py """
import platform
from smb.SMBConnection import SMBConnection
if __name__ == "__main__":
# connection open
conn = SMBConnection(
'<user>',
'<password>',
platform.uname().node,
'<remote_hostname>',
domain='WORKGROUP',
use_ntlm_v2=True)
conn.connect('<ip_address>', 139)
with open('/var/hoge', 'rb') as file:
conn.storeFile('temp', 'a/b/c/hoge.txt', file)
conn.close()
- ディレクトリa/b/cが存在しない場合はエラーになるので事前に作成しておく必要がある。