7

私の質問はこの質問に似ています。

変数を使用してネットワーク共有からローカルディスクにファイルをコピーするにはどうすればよいですか?

唯一の違いは、私のネットワークドライブにはユーザー名とパスワードで保護されたパスワードがあることです。

を使用してファイルをSamba共有にコピーしPython、確認する必要があります。

手動でログインすると、コードは機能しますが、ログインしないとshutilコマンドは機能しません。

4

2 に答える 2

11

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")
于 2010-04-12T23:23:31.367 に答える
4

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 には、より完全な例があります。

于 2014-09-07T12:21:33.873 に答える