Как мне смонтировать файловую систему, используя Python?
Я уверен, что это простой вопрос, мой Google-фу, очевидно, подводит меня.
Как мне смонтировать файловую систему, используя Python, что эквивалентно выполнению команды оболочки mount ...
?
Очевидно, я могу использовать os.system
для запуска команды оболочки, но, безусловно, есть хороший аккуратный интерфейс Python для системного вызова mount.
Я не могу найти это. Я думал, что это будет просто хорошо, легко os.mount()
,
10 ответов
несомненно, это хороший аккуратный интерфейс Python для системного вызова mount.
Я не могу найти его (я подумал, что это будет просто, хорошо os.mount()).
Конечно, нет. Что бы эта функция делала в Windows?
Вместо этого используйте команду оболочки.
Как уже отмечали другие, здесь нет встроенной функции монтирования. Однако его легко создать с помощью ctypes, и это немного легче и надежнее, чем с помощью команды shell:
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')
Другой вариант - использовать довольно новый модуль sh. Согласно документации, она обеспечивает быструю интеграцию с командами Shell из Python.
Я пробую это сейчас, и это выглядит очень многообещающе.
from sh import mount
mount("/dev/", "/mnt/test", "-t ext4")
Также обратите внимание на выпечку, которая позволяет быстро абстрагировать команды в новых функциях.
Вы можете использовать привязки Python для libmount
из проекта util-linux:
import pylibmount as mnt
cxt = mnt.Context()
cxt.source = '/dev/sda1'
cxt.target = '/mnt/'
cxt.mount()
Для получения дополнительной информации см. Этот пример.
Импортировать cdll
от ctypes
, Затем загрузите вашу ОС libc
затем используйте libc.mount()
Читать libc
документы для монтирования параметров
Как уже говорили другие, прямой доступ к системному вызову вам не поможет, если только вы не работаете от имени пользователя root (что обычно плохо по многим причинам). Таким образом, лучше всего обратиться к программе "mount" и надеяться, что /etc/fstab
включил монтирование для пользователей.
Лучший способ вызвать mount - это следующее:
subprocess.check_call(["mount", what])
где what
это либо путь к устройству, либо путь к точке монтирования. Если возникнут какие-либо проблемы, возникнет исключение.
(check_call
это более простой интерфейс, чем Popen
и его братья низкого уровня)
Монтирование - довольно редкая операция, поэтому сомнительно, что есть какой-либо прямой способ сделать это на python.
Либо использовать ctypes
чтобы выполнить операцию непосредственно из Python, или же (и, возможно, лучше), используйте subprocess
вызвать команду монтирования (не используйте os.system()
- намного лучше использовать subprocess
).
Обратите внимание, что для вызова вашей функции монтирования libc потребуются права суперпользователя; Popen(['mount'...) будет работать только в том случае, если конкретное монтирование не благословлено в fstab (эти проверки выполняет исполняемый файл монтирования, корень setuid).
Я знаю, что это старый, но у меня была похожая проблема, и 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
Плохо, что монтаж и демонтаж относятся к вещам, которые сильно зависят от системы, и так как они
- редко используется и
- может повлиять на стабильность системы
Не существует портативного решения. После этого я согласен с Фердинандом Бейером в том, что вряд ли существует общее решение Python.