矿山与此问题类似。如何使用Python将文件复制到网络路径或驱动器
How to copy a file from a network share to local disk with variables?
唯一不同的是我的网络驱动器与用户名和密码的密码保护。
我需要使用Python
将文件复制到Samba
共享并验证它。
如果我手动登录然后代码工作,但没有登录在shutil
命令不起作用。
矿山与此问题类似。如何使用Python将文件复制到网络路径或驱动器
How to copy a file from a network share to local disk with variables?
唯一不同的是我的网络驱动器与用户名和密码的密码保护。
我需要使用Python
将文件复制到Samba
共享并验证它。
如果我手动登录然后代码工作,但没有登录在shutil
命令不起作用。
我会尝试通过调用使用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")
如果你有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
嗨什么是域名参数? – user218976 2010-04-13 02:14:34
当用户进行身份验证时位于不同的身份验证域下时,可以使用doomain名称参数。我没有将它包含在contextlib版本中,因为它可以简单地作为用户名的一部分。如果通过身份验证的用户与当前用户位于同一个域中,则该域可以省略。 – 2010-04-13 07:51:05
谢谢...它的工作...只有时,如果我第二次运行它,我得到一个错误,说本地设备正在使用。 – user218976 2010-04-13 20:57:40