Instalación del módulo python dentro del código


Necesito instalar un paquete de PyPI directamente dentro de mi script. Tal vez hay algún módulo o distutils (distribute, pip etc.) característica que me permite simplemente ejecutar algo como pypi.install('requests') y las solicitudes se instalarán en mi virtualenv.

Author: chuwy, 2012-09-08

10 answers

También puedes usar algo como:

import pip

def install(package):
    if hasattr(pip, 'main'):
        pip.main(['install', package])
    else:
        pip._internal.main(['install', package])

# Example
if __name__ == '__main__':
    install('argh')
 297
Author: Rikard Anglerud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-17 11:37:29

Si desea usar pip para instalar el paquete requerido e importarlo después de la instalación, puede usar este código:

def install_and_import(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        import pip
        pip.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)


install_and_import('transliterate')

Si ha instalado un paquete como usuario, puede encontrar el problema de que no puede simplemente importar el paquete. Vea Cómo actualizar sys.¿camino? para más información.

 60
Author: rominf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:30

La solución de Rickard no es compatible con el equipo de desarrollo de pip y se bloqueará en algunos casos (por ejemplo, multi threaded). Además, desde pip 10 el código se ha movido a pip._internal para dejar claro que esto no es compatible, esta solución fallará con un error de importación en "pip>=10.0.0".

La solución de Quantum es la forma preferida de resolver el problema, sin embargo su implementación no garantiza que llamará al pip correcto.

Esta solución garantiza que llama el pip del intérprete python que ejecuta el código.

import subprocess
import sys

def install(package):
    subprocess.call([sys.executable, "-m", "pip", "install", package])

Hace lo mismo que la solución de Quantum, sin embargo, en lugar de ejecutar pip directamente, ejecuta el mismo ejecutable de python ejecutando el código y le dice que ejecute el módulo pip que ha instalado y le pasa el resto de los argumentos.

 32
Author: Aaron de Windt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-09 13:47:15

Esto debería funcionar:

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])
 12
Author: quantum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-08 17:52:29

Se define el módulo dependiente dentro del setup.py de su propio paquete con la opción" install_requires".

Si su paquete necesita generar algún script de consola, puede usar el punto de entrada" console_scripts " para generar un script de envoltura que se colocará dentro de la carpeta' bin ' (por ejemplo, de su entorno virtualenv).

 7
Author: Andreas Jung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-08 17:38:59

Espero que esta pregunta siga siendo válida. Hice lo anterior algo como esto:

    import sys
    import os
    import site 

    try:
       import pip
    except ImportError:
       print "installing pip"
       cmd = "sudo easy_install pip"
       os.system(cmd)
       reload(site)

    try: 
       import requests
    except ImportError:
       print "no lib requests"
       import pip
       cmd = "sudo pip install requests"
       print "Requests package is missing\nPlease enter root password to install required package"
       os.system(cmd)
       reload(site)

El segundo bloque try también se puede escribir en la parte else del primer bloque try, sin embargo en mi declaración problem tengo que escribir dos bloques separados.

 3
Author: Umesh Kaushik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-12 11:38:38

Asumo que tenemos un pip en nuestra máquina, y trataremos de atrapar la dependencia específica que falta.. prueba este método y hazme saber lo que piensas.

import os
try: 
    import something
    .....
    .....
except ImportError as e:
    pip = lambda : os.system('pip install' + str(e)[15:])
    pip()

También, por favor considere trabajar con el propio módulo pip si usa las funciones lambda para aplicar el mecanismo de importador "autoconciente". Simplemente siguiendo este fragmento de código:)

try:
    import somthing
    ..........
    ..........
except ImportError as e:
    # importing pip module to handle pip functionalites
    import pip
    # create a lambda that import using pip by module_error_name=e[15:]
    installer = lambda : pip.main(['install', str(e)[15:])
    # create a lambda that import a module by linear_lambda_call
    importer = lambda x : __import__(str(x)).import_module()
    # install the module
    installer()
    # import the module
    importer()
 1
Author: SysMurff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-08 19:17:55

Puede instalar usando el módulo sys un pozo

import sys
!{sys.executable} -m pip install <package> --user
 0
Author: Tom J Muthirenthi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-07 17:01:10

Utilizo el os.system para emular un terminal del sistema operativo que importa un módulo porque entonces, puede usar el módulo en todos los otros scripts.

Por ejemplo, estoy creando un Motor de juego que se ejecuta en scripts separados agregados juntos, la mayoría de estos scripts usan Pygame y si el usuario no tiene pygame, el archivo de inicio lo agregará usando este código:

import os
os.system('pip install pygame')

Desafortunadamente, no tengo idea de cómo obtener pip en la máquina del usuario, por lo que esto depende de que el usuario tenga pip.

 0
Author: X0FloH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-14 10:52:03

Siempre puedes descargar

import os

Luego a la derecha todos los comandos de terminal para descargarlo desde allí.

Como

while True:

code = input("")

os.system("code")

Sea lo que sea, no estoy seguro, pero si ni siquiera sabes cómo hacerlo en terminal, cómo lo harás en python.

 -10
Author: techset,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-01 21:32:09