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