如何使用Python将文件复制到网络路径或驱动器

use*_*976 6 python share network-programming drive

我的问题与此类似.

如何使用变量将文件从网络共享复制到本地磁盘?

唯一的区别是我的网络驱动器有用户名和密码保护密码.

我需要Samba使用Python并验证它来将文件复制到共享.

如果我手动登录然后代码工作,但没有登录shutil命令不起作用.

Tam*_*más 10

我尝试NET USE使用os.system(假设您在Windows上)调用命令将共享映射到未使用的驱动器号:

os.system(r"NET USE P: \\ComputerName\ShareName %s /USER:%s\%s" % (password, domain_name, user_name))
Run Code Online (Sandbox Code Playgroud)

将共享映射到驱动器号后,您可以使用shutil.copyfile将文件复制到给定的驱动器.最后,您应该卸载共享:

os.system(r"NET USE P: /DELETE")
Run Code Online (Sandbox Code Playgroud)

当然这仅适用于Windows,您必须确保驱动器号P可用.您可以检查NET USE命令的返回码以查看挂载是否成功; 如果没有,你可以尝试不同的驱动器号,直到你成功.

由于这两个NET USE命令成对出现,第二个命令应始终在执行第一个时执行(即使在其间某处引发异常),如果使用的是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")
Run Code Online (Sandbox Code Playgroud)