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()
.
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.
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')
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.
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()
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
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
).
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).
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])
Où 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)
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.
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