2009-11-03 9 views
22

Ich bin mir sicher, das ist eine einfache Frage, mein Google-Fu versagt mir offensichtlich.Wie mounte ich ein Dateisystem mit Python?

Wie mounte ich ein Dateisystem mit Python, das Äquivalent zum Ausführen der Shell-Befehl mount ...?

Natürlich kann ich os.system verwenden Sie den Shell-Befehl ausführen kann, aber sicher gibt es eine schöne ordentlich, Python-Schnittstelle zu dem montieren Systemaufruf.

Ich kann es nicht finden. Ich dachte, es wäre einfach ein nettes, einfaches os.mount().

+0

Alte Frage, aber für zukünftige Abenteuer. Sehen Sie sich [mount.py] an (https://github.com/MrVallentin/mount.py) – Vallentin

Antwort

3

sicherlich ist dies eine nette, saubere, Python-Schnittstelle zum Mount-System Aufruf.

Ich kann es nicht finden (ich dachte, es wäre nur eine nette, einfache os.mount()).

Sicher gibt es keine. Was würde diese Funktion unter Windows tun?

Verwenden Sie stattdessen den Shell-Befehl.

+11

Verwenden Sie den Shell-Befehl über 'subprocess.Popen (" mount ... ")' –

+1

es ist auch möglich, umount/mount eine Partition auf Windows – Jamol

+10

@Ferdinand 'Was würde diese Funktion unter Windows?' Eigentlich hat Python einige plattformspezifische Module (_winreg, msilib, msvcrt, posix, maxostools, ...), auch einige allgemeine Funktionen verhalten sich anders auf einigen Plattformen wie 'subprocess.Popen (..., shell = False)' zum Beispiel. Dies ist also kein Kriterium, um diese Option auszuschließen. – RedGlyph

3

Das Mounten ist eine ziemlich seltene Operation, daher ist es zweifelhaft, ob es einen direkten Python-Weg dafür gibt.

Entweder ctypes Sie den laufenden Betrieb von Python direkt zu tun, oder aber (und wahrscheinlich besser), verwenden subprocess den Mount-Befehl aufrufen (nicht os.system() nutzen - viel besser subprocess zu verwenden).

+0

Upvoted wegen des Links zur Ctypes-Dokumentation. – Wtower

0

Badly, Ein- und Aushängen gehört zu den Dingen, die sehr systemabhängig sind und da sie

  • selten verwendet werden und
  • kann die Systemstabilität

Es gibt keine Lösung auswirken, ist tragbar verfügbar. Da stimme ich Ferdinand Beyer zu, dass es unwahrscheinlich ist, dass eine allgemeine Python-Lösung existiert.

7

Importieren cdll von ctypes. Dann laden Sie Ihre os libc, verwenden Sie dann libc.mount()

lesen libc ‚s docs für Mount-Parameter

2

Beachten Sie, dass Ihr Aufruf libc-Funktion montiert Root-Rechte erfordern wird; Popen (['mount' ...) wird nur dann, wenn das bestimmte mounting in fstab nicht gesegnet ist (es ist die mount executable, setuid root, die diese Überprüfungen durchführt).

2

Wie andere gesagt haben, ein direkter Zugang zum syscall wird Ihnen nicht helfen, es sei denn, Sie laufen als root (was aus vielen Gründen schlecht ist). Daher ist es am besten, das Programm "mount" aufzurufen und zu hoffen, dass /etc/fstab Mounts für Benutzer aktiviert hat.

Der beste Weg, aufzurufen Halterung ist mit dem folgenden:

subprocess.check_call(["mount", what]) 

wo what entweder dem Gerätepfad oder der Mount-Punkt Pfad ist. Treten Probleme auf, wird eine Ausnahme ausgelöst.

(check_call ist eine einfachere Schnittstelle als Popen und seine Low-Level-Brüder)

+0

Nein, es ist nicht besser, einen Prozess aufzurufen. Es ist viel fehleranfälliger. – LtWorf

+1

@LtWorf wie? Welche Fehler sind beim Aufruf eines Prozesses wahrscheinlicher? Als Kern-Nicht-Experte, wie die meisten Benutzer, fällt es mir schwer vorherzusagen, was wahrscheinlich scheitern wird und was nicht. – Stefan

+0

Sie müssen kein Kernel-Experte sein, um einen Systemaufruf auszuführen. Und Werkzeuge ändern manchmal Parameter, während Systemaufrufe immer gleich bleiben. – LtWorf

6

Eine weitere Möglichkeit, die ziemlich neu sh Modul zu verwenden wäre. Gemäß seiner documentation ermöglicht es eine reibungslose Integration mit Shell-Befehlen aus Python.

Ich probiere es jetzt aus und es sieht sehr vielversprechend aus.

from sh import mount 

mount("/dev/", "/mnt/test", "-t ext4") 

Werfen Sie auch einen Blick auf baking, die Sie schnell abstrahieren Befehle in neue Funktionen ermöglicht.

+2

Bitte geben Sie an, warum diese Antwort die Frage nicht beantwortet, wenn Sie sie ablehnen. Vielen Dank. – samvv

+0

Ich fand das nützlicher als die Ctypes Antwort, die unüberwindbare Fehler gibt, wenn Sie die Argumente falsch erhalten. In meinem Fall waren die benötigten Argumente 'sh.mount ('/ dev/xvdf1', target_dir, '-text4')'. Beachten Sie, dass das letzte Argument keinen Platz hat. – nicb

+0

Der Benutzer gab an, dass die Antwort eine Alternative zum Aufrufen des Befehls mount in einer Shell beschreiben würde. Diese Antwort enthält weiterhin das Aufrufen des Befehls mount in einer Shell und bietet daher keine echte Alternative. –

21

Wie bereits erwähnt, gibt es keine integrierte Mount-Funktion. Allerdings ist es leicht mit ctypes zu erstellen, und das ist ein bisschen ein geringeres Gewicht und zuverlässiger als ein Shell-Befehl:

import ctypes 
import os 

def mount(source, target, fs, options=''): 
    ret = ctypes.CDLL('libc.so.6', use_errno=True).mount(source, target, fs, 0, options) 
    if ret < 0: 
    errno = ctypes.get_errno() 
    raise RuntimeError("Error mounting {} ({}) on {} with options '{}': {}". 
    format(source, fs, target, options, os.strerror(errno))) 

mount('/dev/sdb1', '/mnt', 'ext4', 'rw') 
0

Ich weiß, das ist alt, aber ich hatte ein ähnliches Problem und pexpect es gelöst. Ich konnte mein freigegebenes Windows-Laufwerk mit dem Befehl mount mounten, aber ich konnte mein Passwort nicht eingeben, weil es maskiert werden musste. Ich wurde es leid, zu entkommen und versuchte, eine Datei mit Anmeldeinformationen zu verwenden, die ebenfalls Probleme verursachte. Das scheint für mich zu funktionieren.

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) 

Quelle: https://gist.github.com/nitrocode/192d5667ce9da67c8eac

8

Sie Python-Bindings für libmount aus util-linux Projekt verwenden können:

import pylibmount as mnt 

cxt = mnt.Context() 
cxt.source = '/dev/sda1' 
cxt.target = '/mnt/' 
cxt.mount() 

Weitere Informationen dieses example sehen.

+0

Woher aber pylibmount importieren? – Wtower

+1

@Wtower Es hängt davon ab, welche Linux-Distribution Sie verwenden. Wenn Sie Fedora verwenden, dann ist es [python3-libmount] (https://apps.fedoraproject.org/packages/python3-libmount/) Paket. AFAIK Debian packt keine Python-Bindings für libmount, daher müssen Sie es selbst kompilieren/installieren. – yegorich

Verwandte Themen