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

Posted

技术标签:

【中文标题】如何使用 Python 将文件复制到网络路径或驱动器【英文标题】:How to copy files to network path or drive using Python 【发布时间】:2010-04-12 22:24:41 【问题描述】:

我的问题与此类似。

How to copy a file from a network share to local disk with variables?

唯一的区别是我的网络驱动器使用用户名和密码进行密码保护。

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

如果我手动登录,则代码有效,但不登录 shutil 命令不起作用。

【问题讨论】:

【参考方案1】:

我会尝试使用os.system 调用NET USE 命令将共享映射到未使用的驱动器号(假设您使用的是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命令的返回码看是否挂载成功;如果没有,您可以尝试不同的驱动器号,直到成功为止。

由于两个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")

【讨论】:

嗨,域名参数是什么? 当被认证的用户在不同的认证域下时,可以使用域名参数。我没有将它包含在 contextlib 版本中,因为它可以简单地作为用户名的一部分。如果被认证的用户与当前用户在同一个域中,则域可以省略。 谢谢......它工作......只有当我第二次运行它时,我得到一个错误,说本地设备正在使用中。 谢谢...使用 Subprocess 引起了很多问题,但您的 os.system 方法工作得很好! 5 年后……这对我有帮助。干杯【参考方案2】:

如果您有 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

有a more complete example on ActiveState Code

【讨论】:

以上是关于如何使用 Python 将文件复制到网络路径或驱动器的主要内容,如果未能解决你的问题,请参考以下文章

使用 FileInfo.CopyTo 将文件复制到映射的网络驱动器

如何将指定文件夹虚拟到某路径?求高手解答

python将文件复制到Windows上的网络位置而不映射驱动器

使用带有网络路径或驱动器的 Java 将文件写入远程位置?

使用通配符文件夹批量复制某些文件

如何取消登录时自动映射网络驱动器功能