¿Cómo puedo instalar un módulo Python dentro del código?

1 minuto de lectura

avatar de usuario de chuwy
Chuwy

Necesito instalar un paquete de PyPI directamente dentro de mi guión.

¿Hay tal vez algún módulo o distutils (distribute, pipetc.) característica que me permite simplemente ejecutar algo como pypi.install('requests') y las solicitudes se instalarán en mi virtualenv?

  • ¿Por qué no define el módulo relacionado como dependencia en el archivo setup.py de su propio paquete?

    – Andreas Jung

    08/09/2012 a las 17:34


  • ya sabes… la forma en que se supone que debe hacerse… pero siempre puedes os.system(“pip install blah”) pero es posible que necesites acceso a sudo… mejor simplemente convertirlo en una dependencia en tu configuración. py

    – Joran Beasley

    08/09/2012 a las 17:35

  • ¿Considerarías cambiar la respuesta aceptada aquí? Importador pip nunca es una buena idea – el mero hecho de que todos sus contenidos estén en _internal a partir de la versión 10…

    – Antti Haapala — Слава Україні

    6 de diciembre de 2019 a las 21:53

  • @chuwy stackoverflow.com/a/50255019/918959 pip._internal no está diseñado para ser importable, puede hacer cosas absolutamente aleatorias cuando se importa en otro programa.

    – Antti Haapala — Слава Україні

    11 de diciembre de 2019 a las 10:26

  • @AnttiHaapala está bien, lo cambié. Personalmente, no me gustan ambas soluciones, pero estoy muy lejos de Python en estos días, así que confío en su opinión.

    – Chuwy

    13 de diciembre de 2019 a las 17:12

Avatar de usuario de Aaron de Windt
Aarón de Windt

La forma oficialmente recomendada de instalar paquetes desde un script es llamando a la interfaz de línea de comandos de pip a través de un subproceso. La mayoría de las otras respuestas presentadas aquí no son compatibles con pip. Además, desde pip v10, todo el código se ha movido a pip._internal precisamente con el fin de dejar claro a los usuarios que no se permite el uso programático de pip.

Usar sys.executable para asegurarse de que va a llamar a la misma pip asociado con el tiempo de ejecución actual.

import subprocess
import sys

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

  • Un problema con esto es que, para los usuarios novatos en Windows, python y pip no siempre están en su PATH, por lo que un archivo .py en el que se puede hacer doble clic sería bastante conveniente, mientras que un comentario “pip install xxx” puede ser bastante complicado

    – jdpipe

    17 de abril de 2020 a las 1:27

  • CalledProcessError: Comando ‘[‘C:\\ProgramData\\Anaconda3\\pythonw.exe’, ‘-m’, ‘pip’, ‘install’, ‘googleapiclient’]’ devolvió el estado de salida 1 distinto de cero.

    – parvij

    13 mayo 2020 a las 18:30

  • Estoy tratando de usar este enfoque, pero mi python está incrustado/iniciado desde otro ejecutable, por lo que “sys.executable” no devuelve el camino correcto. ¿Hay alguna alternativa que funcione para python iniciada por algún otro proceso?

    – usuario441669

    26 de diciembre de 2020 a las 23:56

  • cosa extraña, necesito volver a ejecutar el script desde el que se instaló el módulo para que sea reconocido

    – BND

    24 de junio de 2022 a las 7:53

  • nota, ya que 3.5 ahora se recomienda usar subproceso.ejecutar(…, comprobar=Verdadero)

    – Brian

    22 de julio de 2022 a las 12:18

Avatar de usuario de Rikard Anglerud
Rikard Anglerud

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

  • @nbro le pasas opciones a pip.main() como lo haría en la línea de comando (pero con cada opción como una entrada separada en la lista, en lugar de una sola cadena). Y para especificar qué versión del paquete desea, haga lo mismo que en la línea de comando. ej.: pip.main(['install', 'pip==7.1.0'])

    – Kaos

    20 de julio de 2015 a las 10:18


  • Consulte también stackoverflow.com/questions/6457794/…, que muestra cómo manejar el caso en el que falla una instalación.

    – Myer

    20 de julio de 2015 a las 11:21

  • from pip._internal import main as pipmain entonces puedes usar pipmain() al igual que el obsoleto pip.main() ver stackoverflow.com/questions/43398961/…

    – 3 hoyos

    30 de mayo de 2018 a las 15:48

  • ahora está en desuso.

    – Morse

    8 de julio de 2018 a las 1:12

  • Está en desuso por una razón y ya no se recomienda. ver pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program

    – nbk

    28 de julio de 2019 a las 16:56

avatar de usuario de rominf
Rominf

Si quieres 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 instaló un paquete como usuario, puede encontrar el problema de que no puede simplemente importar el paquete. Consulte ¿Cómo actualizar sys.path? para informacion adicional.

  • ¿Alguna idea de cómo hacer eso en Python 3? imp.reload(site) me atrapa RuntimeError: dictionary changed size during iteration

    – kgadek

    03/08/2015 a las 16:35

  • ¿Dónde instala esto el paquete? Después de hacer esto, no pude hacerlo. pip uninstall <package_name>. Todavía puedo desinstalarlo usando pip.main pero solo quería saber dónde instala el paquete?

    – Ishan Khare

    26 de abril de 2016 a las 12:20

  • Tenía curiosidad. ¿Funcionaría correctamente si lo hago: pip install requests[security] ? No estaba seguro de si definiría correctamente los globales correctamente.

    – Segador caído

    8 mayo 2017 a las 16:47

  • Anticuado. pip.main ya no funciona pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program

    – Wim

    5 de diciembre de 2019 a las 16:10

  • ¿La importación dentro de una función realmente importa al espacio de nombres principal, o solo al espacio de nombres de ese install_and_import ¿función?

    – sh37211

    31 de marzo de 2021 a las 0:26

Esto debería funcionar:

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])

Avatar de usuario de Sohan Das
Sohan Das

Agregué un poco de manejo de excepciones a la respuesta de Aaron.

import subprocess
import sys

try:
    import pandas as pd
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", 'pandas'])
finally:
    import pandas as pd

  • buena implementación de subproceso y pip, mejor que la mayoría de las soluciones aquí

    – Shantanu Bedajna

    23 sep 2019 a las 11:30

  • No está comprobando el valor de retorno de subprocess.call por lo que el código podría fallar.

    – Antti Haapala — Слава Україні

    7 de diciembre de 2019 a las 13:42

  • por qué subprocess.check_call y no subprocess.call?

    – Cody

    12 de marzo de 2021 a las 4:50

  • Vale, ejecutar “importar pandas como pd” no trae ningún problema, pero… lógicamente ¿no es feo?

    –Daniel Bandeira

    4 oct 2021 a las 13:14

Avatar de usuario de Serge Stroobandt
serge stroobandt

Para instalar varios paquetes, estoy usando un setup.py archivo con el siguiente código:

import sys
import subprocess
import pkg_resources

required  = {'numpy', 'pandas', '<etc>'} 
installed = {pkg.key for pkg in pkg_resources.working_set}
missing   = required - installed

if missing:
    # implement pip as a subprocess:
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', *missing])

  • buena implementación de subproceso y pip, mejor que la mayoría de las soluciones aquí

    – Shantanu Bedajna

    23 sep 2019 a las 11:30

  • No está comprobando el valor de retorno de subprocess.call por lo que el código podría fallar.

    – Antti Haapala — Слава Україні

    7 de diciembre de 2019 a las 13:42

  • por qué subprocess.check_call y no subprocess.call?

    – Cody

    12 de marzo de 2021 a las 4:50

  • Vale, ejecutar “importar pandas como pd” no trae ningún problema, pero… lógicamente ¿no es feo?

    –Daniel Bandeira

    4 oct 2021 a las 13:14

Avatar de usuario de Peter Mortensen
Pedro Mortensen

Usar:

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

Intenté lo anterior para una solución temporal en lugar de cambiar un archivo acoplable.

  • esto es tan fácil y simple de entender para los principiantes en comparación con todas las demás respuestas. Muchas gracias.

    -Shubham Garg

    3 de noviembre de 2021 a las 9:17

¿Ha sido útil esta solución?