Подтвердить что ты не робот

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

Я уверен, что это простой вопрос, мой Google-фу, очевидно, не дает мне возможности.

Как смонтировать файловую систему с использованием Python, что эквивалентно запуску команды оболочки mount ...?

Очевидно, я могу использовать os.system для запуска команды оболочки, но, конечно же, есть хороший опрятный интерфейс Python для системного вызова mount.

Я не могу найти его. Я думал, что это будет просто, легко os.mount().

4b9b3361

Ответ 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