Я бы попытался сопоставить общий ресурс с неиспользуемой буквой диска, вызвав команду NET USE
с помощью os.system
(при условии, что вы работаете в 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")
person
Tamás
schedule
12.04.2010