私の質問はこの質問に似ています。
変数を使用してネットワーク共有からローカルディスクにファイルをコピーするにはどうすればよいですか?
唯一の違いは、私のネットワークドライブにはユーザー名とパスワードで保護されたパスワードがあることです。
を使用してファイルをSamba
共有にコピーしPython
、確認する必要があります。
手動でログインすると、コードは機能しますが、ログインしないとshutil
コマンドは機能しません。
私の質問はこの質問に似ています。
変数を使用してネットワーク共有からローカルディスクにファイルをコピーするにはどうすればよいですか?
唯一の違いは、私のネットワークドライブにはユーザー名とパスワードで保護されたパスワードがあることです。
を使用してファイルをSamba
共有にコピーしPython
、確認する必要があります。
手動でログインすると、コードは機能しますが、ログインしないとshutil
コマンドは機能しません。
NET USE
次を使用してコマンドを呼び出して、共有を未使用のドライブ文字にマッピングしてみos.system
ます (Windows を使用していると仮定します)。
os.system(r"NET USE P: \\ComputerName\ShareName %s /USER:%s\%s" % (password, domain_name, user_name))
共有をドライブ文字にマップした後、 を使用shutil.copyfile
してファイルを特定のドライブにコピーできます。最後に、共有をアンマウントする必要があります。
os.system(r"NET USE P: /DELETE")
もちろん、これは Windows でのみ機能し、ドライブ文字 P が使用可能であることを確認する必要があります。コマンドの戻りコードをチェックしてNET USE
、マウントが成功したかどうかを確認できます。そうでない場合は、成功するまで別のドライブ文字を試すことができます。
2 つのNET USE
コマンドはペアになっており、最初のコマンドが実行されたときに 2 番目のコマンドが常に実行される必要があるため (途中で例外が発生したとしても)、Python 2.5 または後で:
from contextlib import contextmanager
@contextmanager
def network_share_auth(share, username=None, password=None, drive_letter='P'):
"""Context manager that mounts the given share using the given
username and password to the given drive letter when entering
the context and unmounts it when exiting."""
cmd_parts = ["NET USE %s: %s" % (drive_letter, share)]
if password:
cmd_parts.append(password)
if username:
cmd_parts.append("/USER:%s" % username)
os.system(" ".join(cmd_parts))
try:
yield
finally:
os.system("NET USE %s: /DELETE" % drive_letter)
with network_share_auth(r"\\ComputerName\ShareName", username, password):
shutil.copyfile("foo.txt", r"P:\foo.txt")
pywin32 ライブラリ (たとえば、ActiveState Python ディストリビューションの一部) がある場合は、ドライブをマッピングせずに数行で実行できます。
import win32wnet
win32wnet.WNetAddConnection2(0, None, '\\\\'+host, None, username, password)
shutil.copy(source_file, '\\\\'+host+dest_share_path+'\\')
win32wnet.WNetCancelConnection2('\\\\'+host, 0, 0) # optional disconnect
ActiveState Code には、より完全な例があります。