web-dev-qa-db-fra.com

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 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.

25
jjh

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.

0
Ferdinand Beyer

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')
28
Paul Donohue

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.

11
samvv

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 .

8
yegorich

Importez cdll à partir de ctypes. Puis chargez votre os libc, puis utilisez libc.mount()

Lire les documents libc pour les paramètres de montage

7
marianov

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).

3
David

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.

3
Douglas Leeder

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])

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)

2
gstein

Mauvais, monter et démonter appartient aux choses qui dépendent fortement du système et depuis

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

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.

0
Juergen

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

0
SomeGuyOnAComputer