我的问题类似于这个问题。
唯一的区别是我的网络驱动器有一个带有用户名和密码的密码保护。
我需要使用Python
将文件复制到一个Samba
共享目录并进行验证。
如果我手动登录,则代码可以正常工作,但如果没有登录,则shutil
命令无法工作。
我的问题类似于这个问题。
唯一的区别是我的网络驱动器有一个带有用户名和密码的密码保护。
我需要使用Python
将文件复制到一个Samba
共享目录并进行验证。
如果我手动登录,则代码可以正常工作,但如果没有登录,则shutil
命令无法工作。
我建议尝试使用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")
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网络文件传输相关
。