<p>virtualenv --always-copy не работает на CentOS (проблема с lib64?)</p>

Созданный на 5 мар. 2019  ·  12Комментарии  ·  Источник: pypa/virtualenv

Создание virtualenv с --always-copy на платформе, которая использует каталог /lib64 кажется невозможным.

В CentOS 7.6 то же самое происходит как с системными пакетами (python 2.7.5 , virtualenv 15.1.0 ), так и с
Есть несколько билетов, которые могут быть связаны (# 985, # 1192, # 3477, https://github.com/FPGAwars/icestudio/issues/244), и объединенный запрос на перенос, который предположительно устраняет проблему (# 1189), тем не менее, у меня сложилось впечатление, что что-то все еще происходит не так.

Пример использования SCL (Python 3.6.3 , virtualenv вручную обновлен до 16.4.3 ).
Первая ошибка, похоже, происходит в 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'

Заполните журнал, чтобы увидеть его в контексте.

$ <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

Я действительно пробовал много комбинаций (много версий, играя с PATH и PYTHONPATH), но безуспешно. Любая помощь приветствуется.

Самый полезный комментарий

Venv pip имеет это и выдает ошибку:

! "/ mnt / c / Users / Артем Русаковский / Dropbox / workspace / SNIP.test / SNIP / env-linux / bin / python3"

Вы обнаружили эту уродливую ошибку. На первый взгляд кажется, что в каком-то сценарии bash отсутствует кавычка (что меня не удивило бы, учитывая, как часто это упускается из виду).

Я постараюсь найти его, так как такие вещи меня чешут. Это не решит вашу проблему, но, по крайней мере, мы найдем что-нибудь хорошее для кого-то.

Все 12 Комментарий

Привет, информация для будущих пользователей, на случай, если им понадобится исправление, прежде чем эта ошибка будет устранена.

Поскольку мой проект находится на python3 , я обошел проблему, заменив:

virtualenv --always-copy

с

python -m venv --copies

Это работает на CentOS 7.x (без ModuleNotFoundError: No module named '_socket' и ModuleNotFoundError: No module named 'math' ) и по сути отходит от virtualenv, который в любом случае был жизнеспособным выбором в моем проекте.

Значит, название опции изменилось?
IMO, (если значение то же самое, по крайней мере) (старый) параметр --always-copy long должен поддерживаться как псевдоним для (нового) параметра --copies . Это не должно быть трудным; это не было проблемой для optparse options, где первая найденная длинная строка параметров была той, которая была взята для dest по умолчанию.

Привет @tobiasherp , не совсем так.

Два варианта относятся к разным программам: --always-copy - это вариант virtualenv , --copies - для python -m venv .

Я полностью отказался от virtualenv и использовал -m venv который, начиная с python3, доступен по умолчанию без необходимости устанавливать что-либо и хорошо работает в моем случае.

Понимаю

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'

Когда я пытаюсь запустить tests/test_virtualenv.py::test_always_copy_option

Я вижу ту же проблему в OpenSUSE 15.0 и 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 Есть идеи здесь? Без --always-copy он работает правильно.

Я попробовал обходной путь venv и обнаружил, что он по-прежнему создает символическую ссылку, даже когда используется --copies . Почему?

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 , это правда: /lib64 , с python -m venv --copies все еще символическая ссылка, но, к счастью, это единственная оставшаяся: попробуйте запустить без --copies и посмотрите содержимое /lib/pyhon3.6/site-packages : многие файлы будут символическими ссылками.

Не знаю, достаточно ли этого для ваших нужд. Для меня вариант использования заключался в том, чтобы убедиться, что пользователь случайно не испортил права доступа к файлам в других каталогах во время работы на своем virtualenv. В этом случае допустимо, чтобы / lib64 была символической ссылкой, поскольку она остается в структуре каталогов virtualenv.

Боковое примечание: поскольку python3 по умолчанию имеет доступный venv , я вообще перестал использовать virtualenv.

Я пытаюсь настроить Python env внутри WSL в Windows, в папке Dropbox, и Dropbox сбивает с толку любые символические ссылки. Это последний набор символических ссылок, которые мне оставалось выяснить, и virtualenv был в значительной степени там, если бы не произошел этот математический сбой.

Я имею в виду, я мог бы добавить к venv rm и cp -R и попытаться пойти по этому пути, но было бы хорошо, если бы он действительно делал то, что он говорит, и вообще не имел символических ссылок.

python3 -m venv --copies env-linux && rm env-linux/lib64 && cp -R env-linux/lib env-linux/lib64

Оказывается, venv бесполезен, потому что он не обрабатывает каталоги с пробелами.

virtualenv pip имеет это и работает:

#!/bin/sh
'''exec' "/mnt/c/Users/Artem Russakovskii/Dropbox/workspace/SNIP.test/SNIP/env-linux/bin/python3" "$0" "$@"
' '''

Venv pip имеет это и выдает ошибку:

#!"/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

Подтверждено, что эта проблема math присутствует с использованием последней версии 16.7.7 .

Venv pip имеет это и выдает ошибку:

! "/ mnt / c / Users / Артем Русаковский / Dropbox / workspace / SNIP.test / SNIP / env-linux / bin / python3"

Вы обнаружили эту уродливую ошибку. На первый взгляд кажется, что в каком-то сценарии bash отсутствует кавычка (что меня не удивило бы, учитывая, как часто это упускается из виду).

Я постараюсь найти его, так как такие вещи меня чешут. Это не решит вашу проблему, но, по крайней мере, мы найдем что-нибудь хорошее для кого-то.

https://github.com/pypa/virtualenv/pull/1500 должен решить эту проблему раз и навсегда.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги