Как смонтировать файловую систему с помощью Python?
Я уверен, что это простой вопрос, мой Google-фу, очевидно, не дает мне возможности.
Как смонтировать файловую систему с использованием Python, что эквивалентно запуску команды оболочки mount ...
?
Очевидно, я могу использовать os.system
для запуска команды оболочки, но, конечно же, есть хороший опрятный интерфейс Python для системного вызова mount.
Я не могу найти его. Я думал, что это будет просто, легко os.mount()
.
Ответы
Ответ 1
Конечно, это хороший опрятный интерфейс python для системного вызова mount.
Я не могу найти его (я думал, что это будет просто хороший, простой os.mount()).
Конечно, их нет. Что бы эта функция выполняла в Windows?
Вместо этого используйте команду оболочки.
Ответ 2
Как отмечали другие, здесь нет встроенной функции монтирования. Однако его легко создать с помощью ctypes, и это немного легче и надежнее, чем с помощью команды оболочки:
import ctypes
import ctypes.util
import os
libc = ctypes.CDLL(ctypes.util.find_library('c'), use_errno=True)
libc.mount.argtypes = (ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_ulong, ctypes.c_char_p)
def mount(source, target, fs, options=''):
ret = libc.mount(source, target, fs, 0, options)
if ret < 0:
errno = ctypes.get_errno()
raise OSError(errno, "Error mounting {} ({}) on {} with options '{}': {}".
format(source, fs, target, options, os.strerror(errno)))
mount('/dev/sdb1', '/mnt', 'ext4', 'rw')
Ответ 3
Другой вариант - использовать довольно новый sh модуль. В соответствии с его документацией он обеспечивает плавную интеграцию с командами оболочки из Python.
Я пытаюсь это сделать сейчас, и это выглядит очень многообещающе.
from sh import mount
mount("/dev/", "/mnt/test", "-t ext4")
Также посмотрите baking, что позволяет быстро абстрагировать команды в новых функциях.
Ответ 4
Вы можете использовать привязки Python для libmount
из проекта util-linux:
import pylibmount as mnt
cxt = mnt.Context()
cxt.source = '/dev/sda1'
cxt.target = '/mnt/'
cxt.mount()
Для получения дополнительной информации см. этот .
Ответ 5
Импортировать cdll
из ctypes
. Затем загрузите os libc
, затем используйте libc.mount()
Прочитайте libc
docs для параметров монтирования
Ответ 6
Монтаж - довольно редкая операция, поэтому сомнительно, что есть какой-либо прямой способ python для этого.
Либо используйте ctypes
для выполнения операции непосредственно с python, либо (и, вероятно, лучше), используйте subprocess
для вызова команда mount (не используйте os.system()
- гораздо лучше использовать subprocess
).
Ответ 7
Обратите внимание, что вызов функции libc mount потребует прав root; Popen (['mount'...) будет только в том случае, если конкретный монтаж не будет благословлен в fstab (это исполняемый файл mount, setuid root, который выполняет эти проверки).
Ответ 8
Как утверждали другие, прямой доступ к syscall не поможет вам, если вы не используете root (что обычно плохо, по многим причинам). Таким образом, лучше всего обратиться к программе "mount" и надеяться, что /etc/fstab
разрешил монтирование для пользователей.
Лучший способ вызвать mount - это следующее:
subprocess.check_call(["mount", what])
где what
- либо путь к устройству, либо путь к точке монтирования. Если возникнут какие-либо проблемы, возникает исключение.
(check_call
- более простой интерфейс, чем Popen
и его младшие братья)
Ответ 9
Плохо, установка и размонтирование относятся к тем системам, которые сильно зависят от системы, и поскольку они
- редко используется и
- может повлиять на стабильность системы.
Нет доступного портативного решения. С тех пор я согласен с Фердинандом Бейером, что маловероятно, что существует общее решение Python.
Ответ 10
Я знаю, что это старо, но у меня была аналогичная проблема, и pexpect решил ее. Я смогу подключить свой общий диск Windows с помощью команды mount, но я не смог передать свой пароль, потому что его нужно было экранировать. Я устал избегать этого и пытался использовать файл учетных данных, который также вызывал проблемы. Кажется, это работает для меня.
password = "$wirleysaysneverquit!!!"
cmd = "sudo mount -t cifs -o username=myusername,domain=CORPORATE,rw,hard,nosetuids,noperm,sec=ntlm //mylong.evenlonger.shareddrivecompany.com/some/folder /mnt/folder -v"
p = pexpect.spawn( cmd )
p.expect( ": " )
print( p.before + p.after + password )
p.sendline( password )
p.expect( "\r\n" )
output = p.read()
arroutput = output.split("\r\n")
for o in arroutput:
print( o )
Источник: https://gist.github.com/nitrocode/192d5667ce9da67c8eac