PythonでWindows共有フォルダへアクセス

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>tempabcのファイルリストを取得する場合

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>tempabchoge.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.py
    import 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>tempabchoge.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が存在しない場合はエラーになるので事前に作成しておく必要がある。