礦山與此問題類似。如何使用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