Как мне смонтировать файловую систему, используя 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.

Другие вопросы по тегам