Скопируйте файлы на сетевой путь или на диск с помощью Python в OSX

У меня есть аналогичный вопрос, подобный заданному здесь, но он мне нужен для работы в OSX.

Как скопировать файлы на сетевой путь или диск с помощью Python

Итак, я хочу сохранить файл в общей сетевой папке SMB. Можно ли это сделать?

Спасибо!


person Gumbah    schedule 22.06.2010    source источник


Ответы (1)


Да, это может быть сделано. Сначала подключите общий сетевой ресурс SMB к локальной файловой системе, вызвав из Python такую ​​команду:

mount -t smbfs //user@server/sharename share

(Вы можете сделать это с помощью модуля subprocess). share - это имя каталога, в который будет смонтирован общий сетевой ресурс SMB, и я предполагаю, что он должен быть доступен для записи пользователем. После этого вы можете скопировать файл с помощью shutil.copyfile. Наконец, вам нужно отключить сетевой ресурс SMB:

umount share

Вероятно, лучше всего создать диспетчер контекста на Python, который позаботится о монтировании и размонтировании:

from contextlib import contextmanager
import os
import shutil
import subprocess

@contextmanager
def mounted(remote_dir, local_dir):
    local_dir = os.path.abspath(local_dir)
    retcode = subprocess.call(["/sbin/mount", "-t", "smbfs", remote_dir, local_dir])
    if retcode != 0:
        raise OSError("mount operation failed")
    try:
        yield
    finally:
        retcode = subprocess.call(["/sbin/umount", local_dir])
        if retcode != 0:
            raise OSError("umount operation failed")

with mounted(remote_dir, local_dir):
    shutil.copy(file_to_be_copied, local_dir)

Приведенный выше фрагмент кода не тестировался, но в целом он должен работать (за исключением синтаксических ошибок, которых я не заметил). Также обратите внимание, что mounted очень похож на диспетчер контекста network_share_auth, который я опубликовал в своем другом ответе, поэтому вы также можете объединить их, проверив, на какой платформе вы находитесь, используя модуль platform, а затем вызвав соответствующие команды.

person Tamás    schedule 22.06.2010
comment
Прохладный! Все заработало! Спасибо за быстрый (и подробный) ответ! (Хотел бы проголосовать, но у меня недостаточно репутации: - |) - person Gumbah; 22.06.2010