¿Cómo se hace que los puntos de entrada del script de la consola de Python funcionen cuando el paquete instalado usa un entorno virtual conda?

2
cornas 2019-10-12 12:37.

Problema: el cambio de un entorno no virtual a un entorno virtual conda hace que los puntos de entrada del script de la consola no se reconozcan.

Antecedentes: recientemente intenté tener religión sobre el uso de entornos virtuales para mis proyectos de Python. Decidí hacer esto después de que la actualización a macOS Catalina provocó que todos mis proyectos de PyCharm mostraran errores de intérprete no válidos. Pensé "¿Qué podría salir mal arrojando un gran lío encima de otro?" Dos días después, finalmente pude ejecutar un guión de nuevo, el peor muro de ladrillos que he encontrado. No pude encontrar una solución en ningún lado, así que estoy escribiendo mi primera pregunta SO y mi solución a seguir, pensando que finalmente podría tener algo digno de contribuir a este sitio que he usado tanto durante tanto tiempo.

Mi configuración

  • SO: macOS Catalina
  • Shell: bash (sí, lo cambié de nuevo después de la actualización de Catalina y suprimí el molesto mensaje 'zsh ahora es predeterminado')
  • IDE: PyCharm 19.1 Pro
  • Anaconda: 4.4.7
  • Python: 3.7

Contexto: desarrollo varios paquetes de ciencia de datos interactivos y los instalo localmente en modo editable como práctica general a través de:

My_Machine:my_package my_user_name$ pip install -e .

Creo paquetes de Python usando un archivo setup.py con setuptools, construyendo usando PyCharm. Dentro del archivo setup.py, defino los puntos de entrada del script de la consola como este:

setup.py :

# -*- coding: utf-8 -*-

from setuptools import setup, find_packages

setup(...
      name='my_project',
      entry_points={'console_scripts':['my_entry_name=my_package.scripts.my_python_script:main'
                                      ]},
     ...
)

Antes de cambiar a un entorno virtual conda, estuve ejecutando un script perfectamente bien durante años a través de un archivo por lotes como este:

my_batch_file.command:

#!/bin/bash
cd "$(dirname "$0")"  # set the working directory as the command file locations

my_entry_name <script arguments>

Sin embargo, después de cambiar a un entorno virtual conda, la ejecución del archivo de comando produce un my_entry_name: command not founderror.

Cosas intentadas hasta ahora

  • Verificado e intentado establecer qué Python se usa a través del which pythoncomando de terminal. Puedo ver que el valor predeterminado es /Users/my_user_name/anaconda3/bin/pythony si hago esto desde el símbolo del sistema dentro de mi proyecto, veo que /Users/my_user_name/anaconda3/envs/my_env/bin/pythonrefleja la versión del entorno como se esperaba.
  • Verificó el archivo de punto de entrada real /Users/my_user_name/anaconda3/envs/my_env/bin/my_entry_namepara ver cómo la línea shebang indica la versión de Python, que fue#!/Users/my_user_name/anaconda3/envs/my_env/bin/python
  • Intenté agregar este shebang a la parte superior de mi archivo .command
  • Reinstalé mi paquete muchas veces, pensando que el punto de entrada podría no estar registrado correctamente de alguna manera.
  • Me equivoqué mucho con bash vs zsh, pensando que la transición a zsh por la actualización de Catalina y la vuelta a bash podrían haber causado problemas.
  • Intenté volver a funcionar volviendo del entorno virtual, pero no pudo volver a funcionar la configuración del intérprete no virtual de PyCharm.
  • Revisé el contenido de $ PATH para ver si había problemas.
  • Leer muchos tutoriales sobre entornos virtuales (todo lo que encontré se detiene en lo básico)
  • perseguía hilos sobre errores en herramientas de configuración relacionadas con entornos virtuales
  • Muchas combinaciones de estos esfuerzos.

Nada de esto funcionó, el mismo my_entry_name: command not founderror. Dos días extremadamente frustrantes.

3 answers

0
sinoroc 2019-10-15 05:51.

No es necesario que active los entornos virtuales de Python, nunca, ni siquiera una vez. Supongamos que tiene un entorno virtual en /venv, luego puede llamar /venv/bin/pythono /venv/bin/my_entry_namedesde cualquier lugar en cualquier momento sin activar el entorno virtual y debería funcionar perfectamente bien. Si no funciona, hay un problema con la configuración que debe solucionarse.

Cuando usa los puntos de entrada de setuptools, la ruta completa al intérprete de Python dentro del entorno virtual está codificada en el shebang , por lo que no debería haber forma de que esto no funcione.console_scripts


Actualizar

Mi mal, no había registrado que está trabajando con entornos virtuales conda . No sé cómo funcionan, tal vez mi punto sigue en pie, pero probablemente no.

0
cornas 2019-10-12 13:01.

Después de dos días de lucha, encontré una solución, que publicaré a continuación, sin embargo, me gustaría mucho escuchar comentarios, alternativas y la educación de 'eres un idiota'.

Parece que son necesarios dos elementos:

  • Indicando la versión de python a utilizar como la asociada con el entorno virtual (ya que lo había intentado sin éxito).
  • Activando el entorno virtual.

Cambié mi archivo .command a este, agregando varias verificaciones de verificación innecesarias de la versión de Python antes y después de especificarlo y la salida de texto asociada:

my_batch.command:

#!/usr/bin/env bash

echo "VERIFY: Python version BEFORE activating virtual environment:"
which python

echo "Activating conda virtual environment..."
source activate my_env_name

echo "Setting python version to use in this environment..."
#!/Users/my_username/anaconda3/envs/my_env_name/bin/python

echo "VERIFY: Python version AFTER activating virtual environment:"
which python

cd "$(dirname "$0")"  # set the working directory as the command file locations

echo "RUN THE SCRIPT:"
my_entry_name <script arguments>

La línea clave que me faltaba era source activate my_env_name. Verifiqué que eliminar esto causa fallas, y esto debe incluirse cada vez, no solo una vez, por lo tanto, se incluye en mi archivo .command.

Tampoco me quedó claro si estaba bien tener varias líneas shebang, pero esto funcionó bien.

Me alegro de estar funcionando nuevamente, pero debo admitir que me frustra que la arquitectura no solo haga que mi punto de entrada funcione, punto, sin esta torpeza. La razón para tener el punto de entrada es permitir que un consumidor del script lo llame fácilmente y no tenga que preocuparse por detalles como dónde está el script y cómo está instalado. El uso del entorno virtual parece eliminar estas comodidades del punto de entrada. Estoy a favor de los beneficios de usar entornos virtuales, pero ¿hay alguna forma de tener mi pastel y comérmelo también? Idealmente, llamar al punto de entrada activaría el entorno virtual y sabría qué versión de Python usar. ¿Hay alguna forma mejor de hacer esto que haga eso?

0
cornas 2019-10-18 06:58.

Respuesta revisada después de más aportaciones y experimentos. Encontré dos opciones en las que ambas requieren saber dónde está el archivo real que define el punto de entrada. Para un entorno virtual conda, estará aquí:

/anaconda3/envs/my_env_name/bin/entry_point_name

No es necesario especificar la versión de Python o activar el entorno si se llama a este archivo. Encontré dos formas de hacer esto:

Opción 1 : crédito a @sinoroc, quien primero señaló que el entorno virtual no necesita activarse si el punto de entrada se llama correctamente. Para un entorno virtual conda, eso sería:

my_batch_file.command

#!/bin/bash
cd "$(dirname "$0")"  # set the working directory as the command file locations

~/anaconda3/envs/my_env_name/bin/entry_point_name <my script args>

Para otros tipos de entornos virtuales, simplemente debe ajustar los detalles de la ruta para llegar al archivo de punto de entrada.

Opción 2 : si coloca una copia del archivo del punto de entrada en el contenedor principal de Anaconda:

/anaconda3/bin/my_entry_name

no necesita especificar la ruta, lo que le permite llamar al punto de entrada como deberían funcionar, en mi humilde opinión, es decir, protege al usuario del script del idioma y los detalles de instalación:

my_batch_file.command

#!/bin/bash
cd "$(dirname "$0")"  # set the working directory as the command file locations

entry_point_name <my script args>

Como este paso de copia manual no es elegante, he publicado una pregunta sobre cómo hacerlo mejor: ¿Cómo se puede hacer que un punto de entrada a un script en un entorno virtual esté disponible en todo el sistema?

Related questions

MORE COOL STUFF

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

¿Caduca el repelente de insectos?

¿Caduca el repelente de insectos?

¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?

El mejor lugar para encontrar cosas en Reddit es promover basura misógina

El mejor lugar para encontrar cosas en Reddit es promover basura misógina

Imagen: Gizmodo Subreddit of the Day se trata de celebrar las partes interesantes, extrañas y divertidas de Reddit. Todos los días, los moderadores de SROTD extraen un subreddit de un gran grupo de nominados y lo promocionan.

Batman y el auge de la cultura nerd

Batman y el auge de la cultura nerd

Ilustración: Adam Clark Estes Exactamente al mismo tiempo que Batman se estaba volviendo un obsesivo, una nueva generación de entusiastas comenzó su ascenso a la prominencia. Durante años habían estado al acecho en los rincones sombríos de la cultura popular, persiguiendo silenciosamente sus intereses específicos entre ellos, manteniendo la cabeza baja para evitar la mirada inquisitiva y crítica del resto del mundo.

¿Puede una tableta Windows barata reemplazar su escritorio?

¿Puede una tableta Windows barata reemplazar su escritorio?

Comenzó como una fanfarronada, pero se convirtió en un desafío. Les decía a mis colegas de Gizmodo por qué amaba mi tableta con Windows 8: es rápida, es barata, es una PC en toda regla.

Uber está tratando de mantener su batalla judicial con Google fuera del ojo público

Uber está tratando de mantener su batalla judicial con Google fuera del ojo público

Foto: AP El mes pasado, Google presentó una demanda contra Uber alegando que la compañía de viajes compartidos se confabuló con un exingeniero de Google para robar secretos comerciales y diseños de propiedad de la unidad de autos autónomos Waymo. Hoy, los abogados de Uber presentaron una moción para llevar el caso al agujero oscuro del arbitraje.

Regala el 'mejor sueño de todos' con estos vaporizadores de ducha de eucalipto para el día de San Valentín

Regala el 'mejor sueño de todos' con estos vaporizadores de ducha de eucalipto para el día de San Valentín

Los vaporizadores de ducha de eucalipto BodyRestore tienen más de 11,000 calificaciones de cinco estrellas en Amazon. Ofrezca el producto de spa para el hogar como un regalo del Día de San Valentín para alguien que necesita disfrutar de un poco de cuidado personal.

Esta aspiradora de mano de $ 250 con 'Wicked Suction Power' ahora tiene un 75% de descuento en Amazon

Esta aspiradora de mano de $ 250 con 'Wicked Suction Power' ahora tiene un 75% de descuento en Amazon

Toneladas de compradores de Amazon recomiendan la aspiradora de mano Umlo H6, y está a la venta en este momento. El dispositivo de mano está equipado con un filtro HEPA y viene con varios accesorios. Compre la aspiradora de mano mientras tiene un 75 por ciento de descuento en Amazon

Octavia Spencer dice que la coprotagonista de 'The Help', Sissy Spacek, 'en realidad' la recordó después de hacer una pasantía en su película a los 17

Octavia Spencer dice que la coprotagonista de 'The Help', Sissy Spacek, 'en realidad' la recordó después de hacer una pasantía en su película a los 17

Octavia Spencer trabajó como pasante en la película de 1990 The Long Walk Home, protagonizada por Sissy Spacek, mucho antes de que coprotagonizaran The Help juntas.

Julia Fox se disculpa por no saber que 'Mascara' era el código de agresión sexual del usuario de TikTok

Julia Fox se disculpa por no saber que 'Mascara' era el código de agresión sexual del usuario de TikTok

"Realmente lo siento. Realmente estoy mostrando mi edad en este momento", dijo Julia Fox en un video de respuesta compartido en su TikTok.

¿Merrick Garland le ha fallado a Estados Unidos?

Es más de la mitad de la presidencia de Biden. ¿Qué está esperando Merrick Garland?

¿Merrick Garland le ha fallado a Estados Unidos?

Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.

Lo bueno y lo feo: 2022

Lo bueno y lo feo: 2022

ya no lo entiendo Parece casi imposible medir correctamente lo que es un "golpe".

Solo por diversión: las mejores reproducciones de música nueva de 2022

Solo por diversión: las mejores reproducciones de música nueva de 2022

¡Finalmente! Bienvenido a mis mejores reproducciones de música nueva de 2022. Comparto esto todos los años para conectarme con amigos.

el es todo lo que tengo

el es todo lo que tengo

Revisa tu corazón. Nuestros corazones a menudo se desvían.

Language