Instalación de un módulo en caso de que falte

Tengo un código python que usa el módulo paramiko. Por defecto, paramiko no está instalado y para asegurarme de que el código siempre se ejecutará, necesito agregar algún tipo de método de importación seguro que intente importar el módulo y, en caso de falla, intentará instalarlo. ¿Cuál es la forma más pitónica de lograr un código equivalente al siguiente?

import os, importlib

def SafeImport(module):
    while True:
        try:
            module = importlib.import_module(module)
            return module
        except Exception as e:
            print module + ' is not installed, you will need root privileges to install it. ' + str(e)
            os.system('sudo yum --assumeyes install python-pip python-devel')
            os.system('sudo pip install ' + module)

paramiko = SafeImport('paramiko')

Claramente, este no es un código multiplataforma, fallará en Windows, Mac OS e incluso en distribuciones de Linux sin yum. De hecho, no puedo estar seguro de qué versión de python ejecutará el script, por lo que es posible que importlib no estará disponible para ello. ¿Cuál es la forma pitónica general de abordar tales problemas?

preguntado el 21 de septiembre de 13 a las 12:09

Probablemente la mejor solución sea crear un paquete de Python adecuado y enumerar los requisitos dentro de su archivo de instalación. -

1 Respuestas

La forma más pitónica de hacer esto es

import paramiko

Esto produce la siguiente salida.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named paramiko

Luego, los usuarios pueden tomar una decisión inteligente sobre cómo instalarlo en su sistema. Por supuesto, puede empaquetar su software para que paramiko está instalado para ellos.

Respondido el 21 de Septiembre de 13 a las 12:09

Los usuarios solo necesitan saber cómo usar el software, no les importa paramiko o cualquier procedimiento de instalación, solo quieren usar el software con un dolor de cabeza mínimo. Empaquetar el software con pyinstaller es una opción que estoy considerando y podría funcionar bien, pero estaba tratando de evitar la distribución de archivos binarios. Habiendo dicho eso, no estoy de acuerdo con que un código que que probar definitivamente porque ImportError es verdaderamente pitónico. - e271p314

@e271p314 ¿Cómo va a instalar un usuario su software? tu programa que probar definitivamente no debe instalar software para los usuarios. - alex chambelán

La forma en que quiero que funcione es que el usuario simplemente descargue el script y pueda usarlo de inmediato: e271p314

@e271p314 Si espera que los usuarios hagan eso, serán desarrolladores experimentados y, como tales, pueden encargarse de la instalación paramiko ellos mismos. Estaría bastante enojado si algo instalara un módulo para mí, al menos use algo como distutils y empaquetarlo. - alex chambelán

Lo más probable es que no sean desarrolladores en absoluto, solo usuarios regulares. - e271p314

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.