Comment monter un système de fichiers en utilisant Python?

Je suis sûr que c'est une question facile, mon Google-fu me manque évidemment.

Comment monter un système de fichiers en utilisant Python, l'équivalent de l'exécution de la commande shell mount ...?

Évidemment, je peux utiliser os.system pour exécuter la commande shell, mais il y a sûrement une belle interface Python bien rangée à l'appel système mount.

Je ne le trouve pas. Je pensais que ce serait juste un bon, facile os.mount().

25
demandé sur the Tin Man 2009-11-03 16:10:07

10 réponses

C'est sûrement une belle interface Python bien rangée pour l'appel système de montage.

Je ne peux pas le trouver (je pensais que ce serait juste un bon système d'exploitation facile.montage()).

Certes, il n'y en a pas. Que ferait cette fonction sur Windows?

Utilisez la commande shell à la place.

3
répondu Ferdinand Beyer 2009-11-03 13:12:44

Comme d'autres l'ont souligné, il n'y a pas de fonction de montage intégrée. Cependant, il est facile d'en créer un en utilisant ctypes, ce qui est un peu plus léger et plus fiable que d'utiliser une commande 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')
24
répondu Paul Donohue 2018-03-28 13:21:11

Une autre option serait d'utiliser le module SH assez nouveau. Selon sa documentation , Il fournit une intégration fluide avec les commandes Shell à partir de Python.

Je l'essaie maintenant et il semble très prometteur.

from sh import mount

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

Jetez également un oeil à baking, qui vous permet d'abstraire rapidement les commandes dans de nouvelles fonctions.

8
répondu samvv 2014-09-28 20:15:58

Vous pouvez utiliser des liaisons Python pour libmount depuis util-linux projet:

import pylibmount as mnt

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

Pour plus d'informations, voir cet exemple .

8
répondu yegorich 2016-01-15 13:50:02

Importer cdll à partir de ctypes. Ensuite, chargez votre système d'exploitation libc, puis utilisez libc.mount()

Lire les documents de libc pour les paramètres de montage

7
répondu marianov 2014-11-18 11:29:22

Le montage est une opération assez rare, il est donc douteux qu'il existe un moyen direct de le faire en python.

Utiliser ctypes faire l'opération directement à partir de python, ou d'autre (et probablement mieux), utiliser subprocess pour appeler la commande mount (ne pas utiliser de os.system() - beaucoup mieux d'utiliser subprocess).

3
répondu Douglas Leeder 2009-11-03 13:23:48

Notez que l'appel de votre fonction de montage libc nécessitera des privilèges root; Popen (['mount'...) seulement si le montage n'est pas béni dans fstab (c'est la montagne exécutables setuid root, qui effectue ces contrôles).

3
répondu David 2011-08-05 22:59:00

Comme d'autres l'ont dit, un accès direct à syscall ne vous aidera pas, sauf si vous utilisez root (ce qui est généralement mauvais, pour de nombreuses raisons). Ainsi, il est préférable d'appeler le programme "mount", et j'espère que /etc/fstab a activé les montures pour les utilisateurs.

, La meilleure façon d'invoquer mont - est la suivante:

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

what est soit le chemin du périphérique, soit le chemin du point de montage. Si des problèmes surviennent, une exception sera soulevée.

(check_call est un plus facile interface que Popen et ses frères de bas niveau)

2
répondu gstein 2013-06-14 08:44:31

Mal, le montage et le démontage appartiennent aux choses qui dépendent fortement du système et comme elles sont

  • rarement utilisé et
  • peut affecter la stabilité du système

Il n'y a pas de solution portable disponible. Depuis cela, je suis d'accord avec Ferdinand Beyer, qu'il est peu probable, une solution Python générale existe.

0
répondu Juergen 2009-11-03 13:25:15

Je sais c'est vieux mais j'ai eu un problème similaire et pexpect résolu. Je pouvais monter mon lecteur partagé Windows en utilisant la commande mount mais je ne pouvais pas passer mon mot de passe car il devait être échappé. Je me suis fatigué de l'échapper et j'ai essayé d'utiliser un fichier d'informations d'identification qui a également causé des problèmes. Cela semble fonctionner pour moi.

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 )

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

0
répondu SomeGuyOnAComputer 2015-10-16 21:05:53