Je suis sûr que c'est une question facile, mon Google-fu me manque manifestement.
Comment monter un système de fichiers à l'aide de 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 existe sûrement une interface Nice rangée, Python pour l’appel mount system.
Je ne peux pas le trouver. Je pensais que ce serait simplement une belle, une os.mount()
facile.
il s’agit bien d’une interface ordonnée en python pour l’appel système de montage.
Je ne peux pas le trouver (je pensais que ce serait juste un Nice, facile os.mount ()).
Il n'y en a sûrement pas. Que ferait cette fonction sous 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 , relativement nouveau. Selon sa documentation , il offre une intégration fluide avec les commandes Shell à partir de Python.
Je l'essaie maintenant et ça a l'air très prometteur.
from sh import mount
mount("/dev/", "/mnt/test", "-t ext4")
Jetez également un œil à baking , qui vous permet d’abstraire rapidement les commandes à distance dans de nouvelles fonctions.
Vous pouvez utiliser les liaisons Python pour libmount
à partir de util-linux project:
import pylibmount as mnt
cxt = mnt.Context()
cxt.source = '/dev/sda1'
cxt.target = '/mnt/'
cxt.mount()
Pour plus d'informations, voir cet exemple exemple .
Importez cdll
à partir de ctypes
. Puis chargez votre os libc
, puis utilisez libc.mount()
Lire les documents libc
pour les paramètres de montage
Notez que l'appel de votre fonction de montage libc nécessitera des privilèges root. Popen (['mount' ...) ne le fera que si le montage particulier n'est pas béni dans fstab (c'est l'exécutable de montage, setuid root, qui effectue ces contrôles).
Le montage est une opération assez rare, il est donc douteux qu’il existe un moyen direct de le faire en python.
Utilisez soit ctypes
pour effectuer l'opération directement à partir de python, ou bien (et probablement mieux), utilisez subprocess
pour appeler la commande mount (n'utilisez pas os.system()
- il vaut mieux utiliser subprocess
.
Comme d'autres l'ont déjà indiqué, un accès direct à l'appel système ne vous aidera pas, à moins que vous ne fonctionniez en tant que root (ce qui est généralement mauvais pour de nombreuses raisons). Il est donc préférable d'appeler le programme "mount" et d'espérer que /etc/fstab
a activé les montages pour les utilisateurs.
Le meilleur moyen d'appeler mount est le suivant:
subprocess.check_call(["mount", what])
où what
est soit le chemin d'accès au périphérique, soit le chemin d'accès au point de montage. Si des problèmes surviennent, une exception sera levée.
(check_call
est une interface plus facile que Popen
et ses frères de bas niveau)
Mauvais, monter et démonter appartient aux choses qui dépendent fortement du système et depuis
Il n'y a pas de solution portable disponible. Depuis lors, je conviens avec Ferdinand Beyer, qu’il est peu probable qu’une solution Python générale existe.
Je sais que c'est vieux mais j'ai eu un problème similaire et pexpect l'a résolu. Je pouvais monter mon lecteur partagé Windows à l'aide de la commande mount mais je ne pouvais pas transmettre mon mot de passe car il devait être échappé. J'étais fatigué d'y échapper et j'ai essayé d'utiliser un fichier d'informations d'identification qui posait également 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