Crear un virtualenv con --always-copy
en una plataforma que usa el directorio /lib64
parece imposible.
En CentOS 7.6, lo mismo sucede tanto con los paquetes del sistema (2.7.5 pitón, virtualenv 15.1.0) y los instalados a través de SCL.
Hay algunos tickets que pueden estar relacionados (# 985, # 1192, # 3477, https://github.com/FPGAwars/icestudio/issues/244) y una solicitud de extracción combinada que supuestamente soluciona el problema (# 1189), sin embargo, tengo la impresión de que todavía está sucediendo algo mal.
Ejemplo usando SCL (Python 3.6.3 , virtualenv actualizado manualmente a 16.4.3 ).
El primer error parece ocurrir en virtualenv_support/pip-19.0.3-py2.py3-none-any.whl
:
File "<scl_base>/lib64/python3.6/socket.py", line 49, in <module>
import _socket
ModuleNotFoundError: No module named '_socket'
Registro completo para verlo en contexto.
$ <scl_base>/bin/virtualenv --python <scl_base>/bin/python --always-copy --verbose TEST
Running virtualenv with interpreter <scl_base>/bin/python
Using base prefix '<scl_base>'
Creating <somedir>/TEST/lib/python3.6
Copying to <somedir>/TEST/lib64
Symlinking Python bootstrap modules
Copying to <somedir>/TEST/lib/python3.6/config-3.6m-x86_64-linux-gnu
Copying to <somedir>/TEST/lib/python3.6/lib-dynload
Copying to <somedir>/TEST/lib64/python3.6/os.py
Ignoring built-in bootstrap module: posix
Copying to <somedir>/TEST/lib64/python3.6/posixpath.py
Cannot import bootstrap module: nt
Copying to <somedir>/TEST/lib64/python3.6/ntpath.py
Copying to <somedir>/TEST/lib64/python3.6/genericpath.py
Copying to <somedir>/TEST/lib64/python3.6/fnmatch.py
Copying to <somedir>/TEST/lib64/python3.6/locale.py
Copying to <somedir>/TEST/lib64/python3.6/encodings
Copying to <somedir>/TEST/lib64/python3.6/codecs.py
Copying to <somedir>/TEST/lib64/python3.6/stat.py
Cannot import bootstrap module: UserDict
Creating parent directories for <somedir>/TEST/lib64/python3.6/lib-dynload
Copying to <somedir>/TEST/lib64/python3.6/lib-dynload/readline.cpython-36m-x86_64-linux-gnu.so
Cannot import bootstrap module: copy_reg
Copying to <somedir>/TEST/lib64/python3.6/types.py
Copying to <somedir>/TEST/lib64/python3.6/re.py
Cannot import bootstrap module: sre
Copying to <somedir>/TEST/lib64/python3.6/sre_parse.py
Copying to <somedir>/TEST/lib64/python3.6/sre_constants.py
Copying to <somedir>/TEST/lib64/python3.6/sre_compile.py
Copying to <somedir>/TEST/lib64/python3.6/lib-dynload/zlib.cpython-36m-x86_64-linux-gnu.so
Cannot import bootstrap module: _abcoll
Copying to <somedir>/TEST/lib64/python3.6/warnings.py
Copying to <somedir>/TEST/lib64/python3.6/linecache.py
Copying to <somedir>/TEST/lib64/python3.6/abc.py
Copying to <somedir>/TEST/lib64/python3.6/io.py
Copying to <somedir>/TEST/lib64/python3.6/_weakrefset.py
Copying to <somedir>/TEST/lib64/python3.6/copyreg.py
Copying to <somedir>/TEST/lib64/python3.6/tempfile.py
Copying to <somedir>/TEST/lib64/python3.6/random.py
Copying to <somedir>/TEST/lib64/python3.6/__future__.py
Copying to <somedir>/TEST/lib64/python3.6/collections
Copying to <somedir>/TEST/lib64/python3.6/keyword.py
Copying to <somedir>/TEST/lib64/python3.6/tarfile.py
Copying to <somedir>/TEST/lib64/python3.6/shutil.py
Copying to <somedir>/TEST/lib64/python3.6/struct.py
Copying to <somedir>/TEST/lib64/python3.6/copy.py
Copying to <somedir>/TEST/lib64/python3.6/tokenize.py
Copying to <somedir>/TEST/lib64/python3.6/token.py
Copying to <somedir>/TEST/lib64/python3.6/functools.py
Copying to <somedir>/TEST/lib64/python3.6/heapq.py
Copying to <somedir>/TEST/lib64/python3.6/bisect.py
Copying to <somedir>/TEST/lib64/python3.6/weakref.py
Copying to <somedir>/TEST/lib64/python3.6/reprlib.py
Copying to <somedir>/TEST/lib64/python3.6/base64.py
Copying to <somedir>/TEST/lib64/python3.6/_dummy_thread.py
Copying to <somedir>/TEST/lib64/python3.6/hashlib.py
Copying to <somedir>/TEST/lib64/python3.6/hmac.py
Copying to <somedir>/TEST/lib64/python3.6/imp.py
Copying to <somedir>/TEST/lib64/python3.6/importlib
Copying to <somedir>/TEST/lib64/python3.6/rlcompleter.py
Copying to <somedir>/TEST/lib64/python3.6/operator.py
Copying to <somedir>/TEST/lib64/python3.6/_collections_abc.py
Copying to <somedir>/TEST/lib64/python3.6/_bootlocale.py
Copying to <somedir>/TEST/lib64/python3.6/enum.py
No LICENSE.txt / LICENSE found in source
Creating <somedir>/TEST/lib/python3.6/site-packages
Writing <somedir>/TEST/lib64/python3.6/site.py
Writing <somedir>/TEST/lib64/python3.6/orig-prefix.txt
Writing <somedir>/TEST/lib64/python3.6/no-global-site-packages.txt
Creating <somedir>/TEST/bin
New python executable in <somedir>/TEST/bin/python
Changed mode of <somedir>/TEST/bin/python to 0o775
Copying to <somedir>/TEST/bin/python3
Copying to <somedir>/TEST/bin/python3.6
Testing executable with <somedir>/TEST/bin/python -c "import sys;out=sys.stdout;getattr(out, "buffer", out).write(sys.prefix.encode("utf-8"))"
Got sys.prefix result: '<somedir>/TEST'
Creating <somedir>/TEST/lib64/python3.6/distutils
Writing <somedir>/TEST/lib64/python3.6/distutils/__init__.py
Writing <somedir>/TEST/lib64/python3.6/distutils/distutils.cfg
Traceback (most recent call last):
File "<scl_base>/lib64/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "<scl_base>/lib64/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "<scl_base>/usr/lib/python3.6/site-packages/virtualenv_support/pip-19.0.3-py2.py3-none-any.whl/pip/__main__.py", line 16, in <module>
File "<scl_base>/usr/lib/python3.6/site-packages/virtualenv_support/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/__init__.py", line 19, in <module>
File "<scl_base>/usr/lib/python3.6/site-packages/virtualenv_support/pip-19.0.3-py2.py3-none-any.whl/pip/_vendor/urllib3/__init__.py", line 8, in <module>
File "<scl_base>/usr/lib/python3.6/site-packages/virtualenv_support/pip-19.0.3-py2.py3-none-any.whl/pip/_vendor/urllib3/connectionpool.py", line 7, in <module>
File "<scl_base>/lib64/python3.6/socket.py", line 49, in <module>
import _socket
ModuleNotFoundError: No module named '_socket'
Command <somedir>/TEST/bin/python -m pip config list had error code 1
Installing setuptools, pip, wheel...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
File "<somedir>/TEST/lib64/python3.6/tempfile.py", line 45, in <module>
from random import Random as _Random
File "<somedir>/TEST/lib64/python3.6/random.py", line 42, in <module>
from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
ModuleNotFoundError: No module named 'math'
Complete output from command <somedir>/TEST/bin/python - setuptools pip wheel:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
File "<somedir>/TEST/lib64/python3.6/tempfile.py", line 45, in <module>
from random import Random as _Random
File "<somedir>/TEST/lib64/python3.6/random.py", line 42, in <module>
from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
ModuleNotFoundError: No module named 'math'
----------------------------------------
...Installing setuptools, pip, wheel...done.
Traceback (most recent call last):
File "<scl_base>/usr/lib/python3.6/site-packages/virtualenv.py", line 2567, in <module>
main()
File "<scl_base>/usr/lib/python3.6/site-packages/virtualenv.py", line 793, in main
symlink=options.symlink,
File "<scl_base>/usr/lib/python3.6/site-packages/virtualenv.py", line 1088, in create_environment
install_wheel(to_install, py_executable, search_dirs, download=download)
File "<scl_base>/usr/lib/python3.6/site-packages/virtualenv.py", line 935, in install_wheel
_install_wheel_with_search_dir(download, project_names, py_executable, search_dirs)
File "<scl_base>/usr/lib/python3.6/site-packages/virtualenv.py", line 1025, in _install_wheel_with_search_dir
call_subprocess(cmd, show_stdout=False, extra_env=env, stdin=script)
File "<scl_base>/usr/lib/python3.6/site-packages/virtualenv.py", line 886, in call_subprocess
raise OSError("Command {} failed with error code {}".format(cmd_desc, proc.returncode))
OSError: Command <somedir>/TEST/bin/python - setuptools pip wheel failed with error code 1
Realmente he probado muchas combinaciones (muchas versiones, jugando con PATH y PYTHONPATH) sin suerte. Cualquier ayuda apreciada.
Hola, una información para futuros usuarios, en caso de que necesiten una solución antes de que se solucione este error.
Como mi proyecto está en python3 , evité el problema reemplazando:
virtualenv --always-copy
con
python -m venv --copies
Esto funciona en CentOS 7.x (no ModuleNotFoundError: No module named '_socket'
y ModuleNotFoundError: No module named 'math'
), y esencialmente se aleja de virtualenv, que era una opción viable en mi proyecto de todos modos.
Entonces, ¿el nombre de la opción ha cambiado?
En mi opinión, (si el significado es el mismo, al menos) la opción (antigua) --always-copy
larga debe admitirse como un alias para la (nueva) opción --copies
. Esto no debería ser difícil; no fue un problema para las opciones optparse
, donde la primera cadena de opciones larga encontrada fue la que se tomó para el valor predeterminado dest
.
Hola @tobiasherp , no exactamente.
Las dos opciones se refieren a diferentes programas: --always-copy
es una opción virtualenv
, --copies
es para python -m venv
.
Lo que hice fue deshacerme de virtualenv por completo y usar -m venv
que, a partir de python3, está disponible de forma predeterminada sin necesidad de instalar nada y funciona bien para mi caso.
veo
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
File "/tmp/tmp_6oib3xo/venv/lib64/python3.7/tempfile.py", line 45, in <module>
from random import Random as _Random
File "/tmp/tmp_6oib3xo/venv/lib64/python3.7/random.py", line 42, in <module>
from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
ModuleNotFoundError: No module named 'math'
Cuando intento ejecutar tests/test_virtualenv.py::test_always_copy_option
Veo el mismo problema en OpenSUSE 15.0 y 15.1.
virtualenv --always-copy temp
Using base prefix '/usr'
New python executable in /srv/www/htdocs/dev.SNIP.com/apk-downloader/temp/bin/python3
Also creating executable in /srv/www/htdocs/dev.SNIP.com/apk-downloader/temp/bin/python
Command /srv/www/htdocs/dev....der/temp/bin/python3 -m pip config list had error code 1
Installing setuptools, pip, wheel...
Complete output from command /srv/www/htdocs/dev....der/temp/bin/python3 - setuptools pip wheel:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
File "/srv/www/htdocs/dev.SNIP.com/apk-downloader/temp/lib64/python3.6/tempfile.py", line 45, in <module>
from random import Random as _Random
File "/srv/www/htdocs/dev.SNIP.com/apk-downloader/temp/lib64/python3.6/random.py", line 42, in <module>
from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
ModuleNotFoundError: No module named 'math'
----------------------------------------
...Installing setuptools, pip, wheel...done.
Traceback (most recent call last):
File "/usr/bin/virtualenv", line 11, in <module>
load_entry_point('virtualenv==16.7.5', 'console_scripts', 'virtualenv')()
File "/usr/lib/python3.6/site-packages/virtualenv.py", line 870, in main
symlink=options.symlink,
File "/usr/lib/python3.6/site-packages/virtualenv.py", line 1173, in create_environment
install_wheel(to_install, py_executable, search_dirs, download=download)
File "/usr/lib/python3.6/site-packages/virtualenv.py", line 1019, in install_wheel
_install_wheel_with_search_dir(download, project_names, py_executable, search_dirs)
File "/usr/lib/python3.6/site-packages/virtualenv.py", line 1110, in _install_wheel_with_search_dir
call_subprocess(cmd, show_stdout=False, extra_env=env, stdin=script)
File "/usr/lib/python3.6/site-packages/virtualenv.py", line 963, in call_subprocess
raise OSError("Command {} failed with error code {}".format(cmd_desc, proc.returncode))
OSError: Command /srv/www/htdocs/dev....der/temp/bin/python3 - setuptools pip wheel failed with error code 1
@gaborbernat ¿ Alguna idea aquí? Sin --always-copy
, se ejecuta correctamente.
Probé la solución alternativa venv
y descubrí que todavía crea un enlace simbólico incluso cuando se usa --copies
. ¿Por qué?
python3 -m venv --copies temp
SNIP<strong i="8">@pylon</strong>:/srv/www/htdocs/dev.SNIP.com/apk-downloader> l temp
total 24
drwxr-xr-x 5 SNIP users 4096 Oct 30 14:09 ./
drwxr-xr-x 7 SNIP users 4096 Oct 30 14:09 ../
drwxr-xr-x 2 SNIP users 4096 Oct 30 14:09 bin/
drwxr-xr-x 2 SNIP users 4096 Oct 30 14:09 include/
drwxr-xr-x 3 SNIP users 4096 Oct 30 14:09 lib/
lrwxrwxrwx 1 SNIP users 3 Oct 30 14:09 lib64 -> lib/
-rw-r--r-- 1 SNIP users 69 Oct 30 14:09 pyvenv.cfg
@ archon810 , eso es cierto: /lib64
, con python -m venv --copies
sigue siendo un enlace simbólico, pero afortunadamente ese es el único que queda: intente ejecutar sin --copies
y eche un vistazo al contenido de /lib/pyhon3.6/site-packages
: muchos archivos serán enlaces simbólicos.
No sé si es suficiente para tus necesidades. Para mí, el caso de uso fue asegurarse de que un usuario no estropeara inadvertidamente el permiso de archivo en otros directorios mientras operaba en su virtualenv. En este caso, es aceptable que / lib64 sea un enlace simbólico, ya que permanece dentro de la estructura del directorio virtualenv.
Nota al margen: con python3 disponible venv
por defecto, dejé de usar virtualenv por completo de todos modos.
Estoy tratando de configurar un entorno Python dentro de WSL en Windows, en una carpeta de Dropbox, y Dropbox se confunde con los enlaces simbólicos. Este es el último conjunto de enlaces simbólicos que me queda por descubrir, y virtualenv estaba prácticamente allí, si no hubiera tenido este colapso matemático.
Quiero decir, podría agregar un rm y cp -R a venv e intentar seguir esa ruta, pero sería bueno si realmente hiciera lo que dice que está haciendo y no tuviera ningún enlace simbólico.
python3 -m venv --copies env-linux && rm env-linux/lib64 && cp -R env-linux/lib env-linux/lib64
Ughhh, resulta que venv
no es bueno porque no maneja directorios con espacios.
virtualenv pip tiene esto y funciona:
#!/bin/sh
'''exec' "/mnt/c/Users/Artem Russakovskii/Dropbox/workspace/SNIP.test/SNIP/env-linux/bin/python3" "$0" "$@"
' '''
venv pip tiene esto y genera un error:
#!"/mnt/c/Users/Artem Russakovskii/Dropbox/workspace/SNIP.test/SNIP/env-linux/bin/python3"
bash: env-linux.new/bin/pip3: "/mnt/c/Users/Artem: bad interpreter: No such file or directory
Se confirmó que este problema math
está presente utilizando la última versión 16.7.7
.
venv pip tiene esto y genera un error:
! "/ mnt / c / Users / Artem Russakovskii / Dropbox / workspace / SNIP.test / SNIP / env-linux / bin / python3"
Este es un error feo que encontraste. Por su apariencia, parece una cita faltante en algún script de bash (lo que no me sorprendería, dada la frecuencia con la que se pasa por alto).
Intentaré encontrarlo, ya que este tipo de cosas me pica. No resolverá tu problema, pero al menos saldremos con algo bueno para alguien.
https://github.com/pypa/virtualenv/pull/1500 debería resolver esto ahora de una vez por todas.
Comentario más útil
Este es un error feo que encontraste. Por su apariencia, parece una cita faltante en algún script de bash (lo que no me sorprendería, dada la frecuencia con la que se pasa por alto).
Intentaré encontrarlo, ya que este tipo de cosas me pica. No resolverá tu problema, pero al menos saldremos con algo bueno para alguien.