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

8

我的问题类似于这个问题。

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

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

我需要使用Python将文件复制到一个Samba共享目录并进行验证。

如果我手动登录,则代码可以正常工作,但如果没有登录,则shutil命令无法工作。

2个回答

12

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

我会尝试通过使用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")

嗨,域名参数是什么? - user218976
当被认证的用户处于不同的认证域下时,可以使用doomain name参数。我没有在contextlib版本中包含它,因为它可以简单地成为用户名的一部分。如果被认证的用户与当前用户在同一个域中,则可以省略该域。 - Tamás
谢谢...它起作用了...只是有时候如果我第二次运行它,会出现一个错误,说本地设备正在使用中。 - user218976
谢谢你...使用子进程引起了很多问题,但是你的os.system方法完美地解决了这个问题! - Conor
五年后...这对我有所帮助。干杯 - Busturdust

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上有一个更完整的示例与Windows网络文件传输相关


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接