Chuwy
Necesito instalar un paquete de PyPI directamente dentro de mi guión.
¿Hay tal vez 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?
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
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 usarpipmain()
al igual que el obsoletopip.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
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 atrapaRuntimeError: 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 usandopip.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])
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 nosubprocess.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
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 nosubprocess.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
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
¿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