2009-11-03 10 views
22

Estoy seguro de que esta es una pregunta fácil, mi Google-fu obviamente me está fallando.¿Cómo puedo montar un sistema de archivos usando Python?

¿Cómo puedo montar un sistema de archivos usando Python, el equivalente a ejecutar el comando de shell mount ...?

Obviamente puedo usar os.system para ejecutar el comando shell, pero sin duda hay un bonito ordenado, interfaz de Python para el montaje llamada al sistema.

No lo puedo encontrar. Pensé que sería una buena y fácil os.mount().

+0

Pregunta anterior, pero para futuras aventuras. Eche un vistazo a [mount.py] (https://github.com/MrVallentin/mount.py) – Vallentin

Respuesta

3

seguramente esta es una bonita interfaz ordenada de python para la llamada al sistema de montaje.

No puedo encontrarlo (pensé que sería una buena, fácil os.mount()).

Seguramente, no hay ninguna. ¿Qué haría esta función en Windows?

Use el comando de shell en su lugar.

+11

Use el comando de shell a través de 'subprocess.Popen (" mount ... ")' –

+1

también es posible desmontar/montar una partición en Windows – Jamol

+10

@Ferdinand '¿Qué haría esta función en Windows?' En realidad, Python tiene bastantes módulos específicos de la plataforma (_winreg, msilib, msvcrt, posix, maxostools, ...), también se comportan algunas funciones comunes de manera diferente en algunas plataformas como 'subproceso.Popen (..., shell = False)' por ejemplo. Entonces este no es un criterio para excluir esa opción. – RedGlyph

3

El montaje es una operación bastante rara, por lo que es dudoso que exista una forma directa de hacerlo.

O bien utilizar ctypes hacer la operación directamente de pitón, o de lo contrario (y probablemente mejor), utilice subprocess para llamar al comando de montaje (no utilice os.system() - mucho mejor utilizar subprocess).

+0

Upvoted debido al enlace a la documentación de ctypes. – Wtower

0

mal, montaje y desmontaje pertenece a las cosas que son altamente dependientes del sistema y puesto que son

  • rara vez se utiliza y
  • puede afectar a la estabilidad del sistema

no hay una solución que es portátil disponible. Desde entonces, estoy de acuerdo con Ferdinand Beyer en que es poco probable que exista una solución general de Python.

7

Importación cdll de ctypes. A continuación, cargue el sistema operativo libc, a continuación, utilizar libc.mount()

docs

Leer libc 's para el montaje de los parámetros

2

Tenga en cuenta que llamar a montar sus libc función requerirá privilegios de root; Popen (['mount' ...) solo lo hará si el montaje particular no está bendecido en fstab (es el ejecutable de montaje, raíz de setuid, que realiza estas comprobaciones).

2

Como han indicado otros, un acceso directo a syscall no lo ayudará, a menos que esté ejecutando como root (que generalmente es malo, por muchas razones). Por lo tanto, es mejor llamar al programa "mount" y esperar que /etc/fstab haya habilitado montajes para los usuarios.

La mejor manera de invocar montaje es la siguiente:

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

donde what es o bien la ruta del dispositivo, o la ruta de punto de montaje. Si surge algún problema, se generará una excepción.

(check_call es una interfaz más fácil que Popen y sus hermanos de bajo nivel)

+0

No, no es mejor llamar a un proceso. Es mucho más propenso a errores. – LtWorf

+1

@LtWorf ¿cómo es eso? ¿Qué errores son más probables al llamar a un proceso? Como experto en kernal, como la mayoría de los usuarios, me resulta difícil predecir qué es probable que falle y qué no. – Stefan

+0

No necesita ser un experto en kernel para hacer una llamada al sistema. Y las herramientas a veces cambian los parámetros, mientras que las llamadas al sistema siempre son las mismas. – LtWorf

6

Otra opción sería utilizar el módulo de sh bastante nuevo. De acuerdo con su documentation proporciona una integración fluida con los comandos de Shell desde dentro de Python.

Lo estoy probando ahora y parece muy prometedor.

from sh import mount 

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

también echar un vistazo a baking, lo que le permite rápidamente abstraer comandos en nuevas funciones.

+2

Comente por qué esta respuesta no responde a la pregunta si la rechaza. Gracias. – samvv

+0

Encontré esto más útil que la respuesta ctypes, que proporciona errores inescrutables si obtiene los argumentos incorrectos. En mi caso, los argumentos necesarios eran 'sh.mount ('/ dev/xvdf1', target_dir," -text4 ")'. Tenga en cuenta que el último argumento no tiene espacio. – nicb

+0

El usuario indicó que la respuesta describiría una alternativa a llamar al comando mount en un shell. Esta respuesta aún incluye llamar al comando mount en un shell, y por lo tanto no proporciona una alternativa verdadera. –

21

Como han señalado otros, no hay una función de montaje incorporada. Sin embargo, es fácil crear una con ctypes, y esto es un poco más ligero de peso y más fiable que el uso de un comando shell:

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

Sé que esto es viejo, pero tuve un problema similar y pexpect resuelto. Podía montar mi unidad compartida de Windows usando el comando mount pero no podía pasar mi contraseña porque tenía que ser escapada. Me cansé de escapar e intenté usar un archivo de credenciales que también causó problemas. Esto parece funcionar para mí.

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) 

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

8

Puede utilizar enlaces Python para libmount de util-linux proyecto:

import pylibmount as mnt 

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

Para más información ver esta example.

+0

¿Pero dónde importar pylibmount? – Wtower

+1

@Wtower Depende de la distribución de Linux que esté utilizando. Si está usando Fedora, entonces es el paquete [python3-libmount] (https://apps.fedoraproject.org/packages/python3-libmount/). AFAIK Debian no empaqueta enlaces de Python para libmount, por lo que tendrá que compilar/instalar usted mismo. – yegorich

Cuestiones relacionadas