¿Cómo hago un seguimiento de los paquetes instalados por pip en un entorno Anaconda (Conda)?

141

He instalado y he estado usando la distribución Anaconda Python, y he comenzado a usar el entorno Anaconda (Conda). Puedo usar el conda install...comando estándar para colocar paquetes de la distribución en mis entornos, pero para usar cualquier cosa externa (es decir, Flask-WTF, frasco-sqlalchemy y alambique) que necesito usar pip installen el entorno activo. Sin embargo, cuando miro el contenido del entorno, ya sea en el directorio o usando conda listestos pip installpaquetes ed, no aparecen.

Usando pip freezey pip listsolo enumera cada paquete que he instalado.

¿Hay alguna manera de hacer un seguimiento de lo que hay en cada uno de mis Anaconda env(ambos pipe condainstalados)?

gromiczek
fuente
77
Uso pipinstalado con conda, p ~/anaconda/bin/pip. Ej . Úselo para instalar paquetes en un condaentorno, así como para ver la unión de paquetes instalados con esto pipy con conda install.
osa
77
conda listha incluido durante un tiempo paquetes de python que se instalaron por otros medios (por ejemplo, pip, instalación fácil, directamente con python setup.py install, etc.)
kalefranz
1
No actualice su pip o esta exportación se manguera
Andrew Cassidy

Respuestas:

120

conda-env ahora lo hace automáticamente (si pip se instaló con conda).

Puede ver cómo funciona esto utilizando la herramienta de exportación utilizada para migrar un entorno:

conda env export -n <env-name> > environment.yml

El archivo enumerará tanto los paquetes conda como los paquetes pip:

name: stats
channels:
  - javascript
dependencies:
  - python=3.4
  - bokeh=0.9.2
  - numpy=1.9.*
  - nodejs=0.10.*
  - flask
  - pip:
    - Flask-Testing

Si desea continuar con la exportación del entorno, vaya environment.ymla la nueva máquina host y ejecute:

conda env create -f path/to/environment.yml
conner.xyz
fuente
64

condasolo hará un seguimiento de los paquetes que instaló. Y piple dará los paquetes que se instalaron utilizando el pipinstalador en sí o que utilizaron setuptoolsen su setup.pycompilación de modo que conda generó la información del huevo. Entonces tienes básicamente tres opciones.

  1. Usted puede tomar la unión de la conda liste pip freezey gestionar paquetes instalados usando conda(que muestran la conda list) con el condagestor de paquetes y los que se instalan con pip(ese programa en pip freezepero no en conda list) con pip.

  2. Instalar sólo en el entorno python, pipy distributelos paquetes y gestionar todo con pip. (Esto no es tan trivial si estás en Windows ...)

  3. Cree sus propios condapaquetes y gestione todo con conda.

Yo personalmente recomendaría la tercera opción ya que es muy fácil construir condapaquetes. Hay un repositorio git de recetas de ejemplo en la cuenta github del continuo. Pero generalmente se reduce a:

 conda skeleton pypi PACKAGE
 conda build PACKAGE

o solo:

conda pipbuild PACKAGE

Además, cuando los haya creado una vez, puede subirlos a https://binstar.org/ e instalarlos desde allí.

Entonces tendrás todo administrado usando conda.

Viktor Kerkez
fuente
3
Solo intenté ~/anaconda/bin/pip install memory-profilery conda install numba, y ambos se muestran ~/anaconda/bin/pip freeze.
osa
2
"repositorio git de recetas de ejemplo en la cuenta github del continuo" ¿Te refieres a github.com/ContinuumIO/anaconda-recipes ? Por favor, enlace si puede
endolith
Sin embargo, esto en realidad no instala el paquete para que pueda importarlo. Debe hacer lo conda install C:\...PACKAGE-0.0.0-py27_0.tar.bz2que se describe en stackoverflow.com/a/20750388/125507
endolith
Yo diría que primero tenga siempre conda install python=3.x.yen su entorno de conda de modo que las instalaciones posteriores de pip pasen por el pip instalado de conda.
Ustaman Sangat
24

Hay una rama de conda (new-pypi-install) que agrega una mejor integración con pip y PyPI. En particular, la lista de conda también mostrará los paquetes instalados con pip y la instalación de conda primero intentará encontrar un paquete de conda y, en su defecto, utilizará pip para instalar el paquete.

Esta rama está programada para fusionarse más adelante esta semana para que la versión 2.1 de conda tenga una mejor integración pip con conda.

Travis Oliphant
fuente
2
Me gustaría señalar que esto ya está funcionando en conda 2.2.3 (y probablemente antes de eso). La forma en que funciona es que si intenta conda install packagey no puede encontrar una receta de conda, intenta instalarla a través de pip(y luego realiza un seguimiento). Incluso sugiere útil la instalación, pipsi no en su entorno. ¡Gracias Travis por todo tu trabajo!
jorgeca
55
Aclaración, ya que he leído mal esto varias veces. @Travis significa que creo que si uno se está ejecutando dentro de una conda, ¿ejecutar pip primero buscará paquetes de conda? Lo contrario definitivamente no es cierto: la instalación de conda no busca paquetes pypi, ni siquiera elementos en pypi.binstar.org. Esto es a partir de conda 3.5.2.
AnneTheAgile
9
¿Se ha eliminado esto? Si ejecuto, por ejemplo, conda install autopep8me dice "No se encontró ningún paquete" y que debería buscar en anaconda.org manualmente.
endolito
@AnneTheAgile running pip...tampoco funciona, no buscará el paquete conda en absoluto.
Wang
16

Seguí la respuesta de @Viktor Kerkez y he tenido un éxito mixto. Encontré que a veces esta receta de

PAQUETE esqueleto conda pypi

paquete de construcción conda

parecería que todo funcionó pero no pude importar con éxito el PAQUETE. Recientemente pregunté sobre esto en el grupo de usuarios de Anaconda y escuché del propio @Travis Oliphant sobre la mejor manera de usar conda para construir y administrar paquetes que no se envían con Anaconda. Puede leer este hilo aquí , pero describiré el enfoque a continuación para que las respuestas a la pregunta del OP sean más completas ...

Ejemplo: voy a instalar el excelente paquete prettyplotlib en Windows usando conda 2.2.5.

1a) conda build --build-recipe prettyplotlib

Verá que todos los mensajes de compilación se ven bien hasta la sección TEST final de la compilación. Vi este error

Archivo "C: \ Anaconda \ conda-bld \ test-tmp_dir \ run_test.py", línea 23 importar Ninguno SyntaxError: no se puede asignar a Ninguno PRUEBAS FALLIDAS: prettyplotlib-0.1.3-py27_0

1b) Vaya a / conda-recipes / prettyplotlib y edite el archivo meta.yaml. Actualmente, los paquetes que se configuran como en el paso 1a dan como resultado archivos yaml que tienen un error en la testsección. Por ejemplo, así es como se buscaba el míoprettyplotlib

test:   # Python imports   imports:
    - 
    - prettyplotlib
    - prettyplotlib

Edite esta sección para eliminar la línea en blanco precedida por - y también elimine la línea redundante prettyplotlib. Al momento de escribir esto, descubrí que necesito editar la mayoría de los archivos meta.yaml como este para paquetes externos que estoy instalando con conda, lo que significa que hay una línea de importación en blanco que causa el error junto con una importación redundante del paquete dado .

1c) Vuelva a ejecutar el comando desde 1a, que esta vez debería completarse sin error. Al final de la compilación, se le preguntará si desea cargar la compilación en binstar . Ingresé No y luego vi este mensaje:

Si desea cargar este paquete en binstar.org más tarde, escriba:

$ binstar upload C: \ Anaconda \ conda-bld \ win-64 \ prettyplotlib-0.1.3-py27_0.tar.bz2

Ese archivo tar.bz2 es la compilación que ahora necesita instalar realmente.

2) conda install C:\Anaconda\conda-bld\win-64\prettyplotlib-0.1.3-py27_0.tar.bz2

Siguiendo estos pasos, he utilizado con éxito conda para instalar varios paquetes que no vienen con Anaconda. Anteriormente, había instalado algunos de estos utilizando pip, así que lo hice pip uninstall PACKAGEantes de instalar PACKAGE con conda. Usando conda, ahora puedo administrar (casi) todos mis paquetes con un solo enfoque en lugar de tener una combinación de cosas instaladas con conda, pip, easy_install y python setup.py install.

Para el contexto, creo que esta reciente publicación de blog de @Travis Oliphant será útil para las personas como yo que no aprecian todo lo que entra en el robusto empaque de Python, pero ciertamente aprecian cuando las cosas "simplemente funcionan". Conda parece un gran camino a seguir ...

Josh Hemann
fuente
2
Con la versión 3.5.2 de conda, el comando $ conda build --build -cipe XXX; Errores con 'argumentos no reconocidos: --build -cipe'. La respuesta completa es; uso: conda-build [-h] [-c] [--no-binstar-upload] [--output] [-s] [-t] [--no-test] [-V] [-q] RECIPE_PATH [RECIPE_PATH ...] conda-build: error: argumentos no reconocidos: --build
-cipe
10

Es por eso que escribí Picky: http://picky.readthedocs.io/

Es un paquete de Python que rastrea los paquetes instalados con pip o conda en virtualenvs y conda envs.

Chris Withers
fuente
3

Creo que lo que falta aquí es que cuando lo haces:

>pip install .

para instalar un paquete local con un archivo setup.py, instala un paquete que es visible para todos los entornos de conda que usan la misma versión de python. Tenga en cuenta que estoy usando la versión conda de pip!

por ejemplo, si estoy usando python2.7, pone el paquete local aquí:

/usr/local/anaconda/lib/python2.7/site-packages

Si luego creo un nuevo entorno de conda con python = 2.7 (= el valor predeterminado):

>conda create --name new

>source activate new

Y luego hacer:

(new)>conda list    // empty - conda is not aware of any packages yet

Sin embargo, si lo hago:

(new)>pip list      // the local package installed above is present

Entonces, en este caso, conda no conoce el paquete pip, pero el paquete está disponible para python.

Sin embargo, si instalo el paquete local (nuevamente usando pip) después de haber creado (y activado) el nuevo conda env, ahora conda lo ve:

(new)>conda list   // sees that the package is there and was installed by pip

Por lo tanto, creo que la interacción entre conda y pip tiene algunos problemas, es decir, usar pip para instalar un paquete local desde un conda env hace que ese paquete esté disponible (pero no se ve a través de la lista de conda) para todos los demás env conda de la misma versión de Python.

MH
fuente
2

Normalmente prefijo la carpeta 'bin / pip' para el entorno específico en el que desea instalar el paquete antes del comando 'pip'. Por ejemplo, si desea instalar pymc3 en el entorno py34, debe usar este comando:

~/anaconda/envs/py34/bin/pip install git+https://github.com/pymc-devs/pymc3 

Básicamente, solo necesita encontrar la ruta correcta a la carpeta 'bin / pip' de su entorno y colocarla antes del comando de instalación.

Gianluca
fuente
1

Mi which pipmuestra la siguiente ruta:

$ which pip
/home/kmario23/anaconda3/bin/pip

Entonces, cualquier paquete que instale usando pip install <package-name>tendrá que reflejarse en la lista de paquetes cuando la lista se exporta usando:

$ conda list --export > conda_list.txt

Pero yo no. Entonces, en su lugar, utilicé el siguiente comando según lo sugerido por varios otros:

# get environment name by
$ conda-env list

# get list of all installed packages by (conda, pip, etc.,)
$ conda-env export -n <my-environment-name> > all_packages.yml
# if you haven't created any specific env, then just use 'root'

Ahora, puedo ver todos los paquetes en mi all-packages.ymlarchivo.

kmario23
fuente
1

Puede comenzar instalando el siguiente comando dado en el entorno conda:

conda install pip

Luego, instale todos los paquetes de pip que necesita en el entorno.

Después de instalar todos los paquetes conda y pip para exportar el uso del entorno:

conda env export -n <env-name> > environment.yml

Esto creará el archivo requerido en la carpeta

Kavish
fuente