Virtualenv: Incluir secuencias de comandos de la biblioteca estándar en las secuencias de comandos de virtualenv

Creado en 2 ago. 2019  ·  22Comentarios  ·  Fuente: pypa/virtualenv

Parece que 2to3 actualmente no está siendo redirigido por Virtualenv. Consulte https://travis-ci.community/t/2to3-command-not-found-in-virtualenv-in-bionic/4495 para ver un caso en el que el usuario no lo esperaba, ya que normalmente está disponible en PATH para una instalación de Linux.

A la luz de que Py2 se acerca a EOL, ¡la demanda aumentará!


  • [X] Ejemplo reproducible mínimo o descripciones detalladas
$ which 2to3
/home/vmuser/.pyenv/shims/2to3

$ pyenv install 3.6.9
<...>

$ ~/.pyenv/versions/3.6.9/bin/python -m pip install virtualenv
Collecting virtualenv
  Downloading https://files.pythonhosted.org/packages/db/9e/df208b2baad146fe3fbe750eacadd6e49bcf2f2c3c1117b7192a7b28aec4/virtualenv-16.7.2-py2.py3-none-any.whl (3.3MB)
    100% |████████████████████████████████| 3.3MB 1.3MB/s 
Installing collected packages: virtualenv
Successfully installed virtualenv-16.7.2

$ ~/.pyenv/versions/3.6.9/bin/python -m virtualenv test
Using base prefix '/home/vmuser/.pyenv/versions/3.6.9'
New python executable in /home/vmuser/test/bin/python
Installing setuptools, pip, wheel...
done.

$ . test/bin/activate

(test) $ which 2to3
/home/vmuser/.pyenv/shims/2to3

El comportamiento esperado era que los últimos which devolvieran una ruta dentro de virtualenv, lo mismo que para, por ejemplo python y pip .

  • [X] SO y salida pip list
    Escritorio biónico Ubuntu x64
$ ~/.pyenv/versions/3.6.9/bin/python -m pip list
Package    Version
---------- -------
pip        18.1   
setuptools 40.6.2 
virtualenv 16.7.2 
enhancement help-wanted

Comentario más útil

Como solución alternativa, puede usar python -m lib2to3 dentro de su virtualenv, con una funcionalidad equivalente.

Todos 22 comentarios

¿Esto todavía ocurre después de hacer un refrito de pyenv?

¿Qué ejecuta el shim cuando se ejecuta antes o después del refrito de pyenv?

Tengo la sensación de que esto tiene algo que ver con pyenv.

¿Esto todavía ocurre después de hacer un refrito de pyenv?

Si.

¿Qué ejecuta el shim cuando se ejecuta antes o después del refrito de pyenv?

Dado que system Python está seleccionado para el cual el paquete apt con 2to3 no está instalado, dice

pyenv: 2to3: command not found

The `2to3' command exists in these Python versions:
<list>

en ambos casos.

Tengo la sensación de que esto tiene algo que ver con pyenv.

pyenv es irrelevante. El comportamiento esperado era que el segundo which devolviera el shim virtualenv como lo hace con python . El error es que virtualenv no crea uno. (Pensé que esto era obvio. Probablemente no).

Ah, está bien... ¿Cuánto es PATH después de la activación?

(No estoy en una máquina donde pueda intentar reproducir esto ahora)

(test) vmuser<strong i="5">@ubuntuvm</strong>:~$ echo $PATH
/home/vmuser/test/bin:/home/vmuser/.rbenv/shims:/home/vmuser/.rbenv/bin:/home/vmuser/.pyenv/shims:/home/vmuser/.pyenv/bin:/home/vmuser/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/vmuser/.rvm/bin
(test) vmuser<strong i="6">@ubuntuvm</strong>:~$ ls /home/vmuser/test/bin
activate       activate_this.py  pip     python3
activate.csh   activate.xsh      pip3    python3.6
activate.fish  easy_install      pip3.6  python-config
activate.ps1   easy_install-3.6  python  wheel

Como solución alternativa, puede usar python -m lib2to3 dentro de su virtualenv, con una funcionalidad equivalente.

/cc other @pypa/virtualenv-committers si creen que agregar scripts de la biblioteca estándar a virtualenv al crearlos es una buena idea.

soy ambivalente

Estoy -0.5. Es un desorden adicional que no se ha señalado como un problema hasta ahora, así que asumo que la necesidad es rara. No estoy convencido de que Python 2 acercándose a EOL haga una diferencia aquí. Los scripts adicionales tampoco están en PATH en un entorno no virtual en Windows, por lo que la expectativa de que estén presentes no es universal.

Creo que esto debería funcionar como un enfoque general. Todas las aplicaciones en el entorno del host deben estar disponibles en el nivel del entorno virtual.

No estoy convencido de que Python 2 acercándose a EOL haga una diferencia aquí.

+1

Esa tampoco es mi preocupación aquí. :)

Los scripts adicionales tampoco están en PATH en un entorno no virtual en Windows

Oh. ¿No están estos en el directorio Scripts/ ? Según entendí, los instaladores actuales de python.org agregan ese directorio a PATH y, por lo tanto, pueden ejecutarse.

Todas las aplicaciones en el entorno del host deben estar disponibles en el nivel del entorno virtual.

Uhm... "aplicaciones" es un poco vago aquí, ¿te refieres a los guiones o algo más? ¿Podría por favor aclarar lo que quiere decir?

Tenga en cuenta que si hacemos esto, soy un fuerte -1 en incluir todos los scripts del entorno host de todos modos y ambivalente en incluir los respaldados por la biblioteca estándar.

Oh. ¿No están estos en el directorio Scripts/?

No, todo lo que hay en Scripts son contenedores de punto de entrada para bibliotecas instaladas (pip, easy_install y rueda en una instalación base). Mirando un poco más allá, 2to3.py está en Tools/scripts (junto con un grupo bastante mixto de más de 60 scripts), pero ese directorio no está en PATH , incluso si el usuario selecciona "Agregar Python a su RUTA".

Tenga en cuenta que si hacemos esto, soy un fuerte -1 en incluir todos los scripts del entorno del host de todos modos y ambivalente en incluir los respaldados por la biblioteca estándar.

Como mínimo, diría que no deberíamos agregar más a PATH de lo que hace una instalación básica. Lo que significa que incluso si hacemos esto, no lo hacemos en Windows.

pradyunsg cambió el título Incluir secuencias de comandos de la biblioteca estándar en el contenedor de virtualenv/Incluir secuencias de comandos de la biblioteca estándar en las secuencias de comandos de virtualenv hace 2 horas

Solo notando que este es un ligero cambio de alcance. El OP solo estaba interesado específicamente en 2to3 , y en particular que la activación de un virtualenv no sombreara el sistema 2to3 . No puedo comentar si eso es importante (dado que he argumentado que esto no sucede en Windows, no tengo experiencia relevante en Unix para decir si siento que esto es un problema). Pero sin saber qué otras secuencias de comandos son "secuencias de comandos de la biblioteca estándar", no puedo comentar si este es un punto importante.

Hmm, pyvenv es probablemente otro "script de biblioteca estándar", y estoy bastante seguro de que no queremos ensombrecer la versión del sistema de eso con uno que ejecuta venv desde un entorno virtualenv (ya que eso solo causa complicaciones sin ningún beneficio práctico).

El OP estaba... interesado... en particular en que la activación de un virtualenv no sombreara el sistema 2to3.

(No estoy seguro de lo que esta frase pone en mi boca, podría interpretarse en ambos sentidos).

Para mayor claridad, estoy pidiendo virtualenv para crear una corrección para 2to3 .

(Permítanme editar la publicación original con el comportamiento esperado, veo que omitirlo está causando confusión).

(Déjame editar la publicación original con el comportamiento esperado)

Hecho. También aclaré por qué el usuario esperaba que estuviera en PATH .

No estoy seguro de lo que esta frase pone en mi boca

¡Perdón por tergiversar sus comentarios y gracias por la aclaración! (Parece que entendí correctamente lo que estabas preguntando, solo lo replanteé mal...)

También aclaré por qué el usuario esperaba que estuviera en PATH.

El enlace al que haces referencia es un poco confuso. El usuario parece tener un proceso que funciona en Trusty y Xenial, pero no en Bionic. No me queda claro por qué ese sería el caso si el problema está en virtualenv. (Nota: esto es una digresión; independientemente, es evidente que virtualenv no copia 2to3.py , por lo que la discusión sobre si deberíamos es válida incluso si el problema original es más sutil).

Estoy pidiendo virtualenv para crear una cuña para 2to3.

Tenga en cuenta que nunca crearemos una cuña. Todo lo que haríamos sería copiar el script 2to3.py . Si se necesita una cuña (eso es una cosa de pyvenv, creo), entonces no seríamos nosotros los que manejaríamos eso.

No, todo lo que hay en los scripts son envoltorios de puntos de entrada para las bibliotecas instaladas (pip, easy_install y wheel en una instalación base).

Oooooooooooooo. Bueno.

Solo notando que este es un ligero cambio de alcance.

No creo que 2to3 sea un copo de nieve especial; si agregamos eso, espero que alguien venga a preguntar por el resto. Deberíamos hacer esto completamente o no hacerlo en absoluto. Estar atrapado a mitad de camino no es algo que querríamos aquí.

(Odio la interfaz de usuario móvil)

Es "especial" porque está respaldado por la biblioteca estándar Y está en PATH para una instalación estándar de Linux.
En realidad, no hay muchas otras herramientas como esta. Aparte de 2to3 , son solo pydoc , idle y pyvenv :

$ ls ~/.pyenv/versions/3.6.9/bin
2to3          easy_install-3.6  idle3.6  pip3.6  pydoc3.6  python3.6         python3.6m         python-config  virtualenv
2to3-3.6      idle              pip      pydoc   python    python3.6-config  python3.6m-config  pyvenv
easy_install  idle3             pip3     pydoc3  python3   python3.6-gdb.py  python3-config     pyvenv-3.6

(también python-config que ya está siendo redirigido)

¡Ah, gracias por la aclaración @native-api! Muy apreciado. Junto con la explicación de @pfmoore de cómo este es un problema que no está en Windows, eso ayuda a mi comprensión. :)

Todavía soy ambivalente en incluirlo.

Aparte de 2to3, es solo pydoc, inactivo y pyvenv

Me gustaría saber quién eligió esa lista. ¿Es específicamente pyvenv? Ubuntu (bash en Windows y una imagen de la ventana acoplable con python3 instalado) no parece tener 2to3 de manera predeterminada, aunque la imagen de la ventana acoplable de Python tiene los mismos archivos binarios que mencionó (más pip, easy_install y rueda, que provienen de los paquetes instalados). Parece un poco dependiente de la distribución :-( Sin embargo, al menos la lista de binarios relevantes parece consistente.

Por cierto, como dije anteriormente, incluso si hacemos este cambio, recomiendo encarecidamente no incluir pyvenv.

Ubuntu (bash en Windows y una imagen acoplable con python3 instalado) no parece tener 2to3 por defecto

Eso es porque en Ubuntu, 2to3 se mueve a un paquete separado:

$ apt-file search 2to3 | grep -E '/2to3[^/]*$'
2to3: /usr/bin/2to3
<...>
python2.7: /usr/bin/2to3-2.7
<...>

Por "instalación estándar de Linux", me refiero a la lógica que es intrínseca al script de compilación de Linux de Python, sin la intromisión de las distribuciones, por ejemplo, si instala desde la fuente (que es lo que hace pyenv ).

Podría tomar esto y trataré de trabajar en esto.

Tenga en cuenta que esto reemplazaría nuestro truco actual de agregar pydoc como parte del script de activación.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

erbatyr picture erbatyr  ·  5Comentarios

jwarren116 picture jwarren116  ·  5Comentarios

npinto picture npinto  ·  4Comentarios

manthey picture manthey  ·  4Comentarios

mitchhentges picture mitchhentges  ·  3Comentarios