<p>virtualenv --always-copy schlägt unter CentOS fehl (lib64-Problem?)</p>

Erstellt am 5. März 2019  ·  12Kommentare  ·  Quelle: pypa/virtualenv

Das Erstellen einer virtuellen Umgebung mit --always-copy auf einer Plattform, die das Verzeichnis /lib64 scheint unmöglich zu sein.

Unter CentOS 7.6 passiert dasselbe sowohl mit den Systempaketen (python 2.7.5 , virtualenv 15.1.0 ) als auch mit den über SCL installierten.
Es gibt einige Tickets, die möglicherweise zusammenhängen (#985, #1192, #3477, https://github.com/FPGAwars/icestudio/issues/244) und eine zusammengeführte Pull-Anfrage, die das Problem angeblich behebt (#1189), dennoch habe ich den Eindruck, dass noch etwas nicht stimmt.

Beispiel mit SCL (Python 3.6.3 , virtualenv manuell auf 16.4.3 aktualisiert ).
Der erste Fehler scheint in 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'

Vervollständigen Sie das Protokoll, um es im Kontext zu sehen.

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

Ich habe wirklich viele Kombinationen ausprobiert (viele Versionen, mit PATH und PYTHONPATH gespielt) ohne Erfolg. Jede Hilfe geschätzt.

bug

Hilfreichster Kommentar

venv pip hat dies und gibt einen Fehler aus:

!"/mnt/c/Users/Artem Russakovskii/Dropbox/workspace/SNIP.test/SNIP/env-linux/bin/python3"

Dies ist ein hässlicher Fehler, den Sie gefunden haben. Vom Aussehen her scheint ein Zitat in einem Bash-Skript zu fehlen (was mich nicht überraschen würde, wenn man bedenkt, wie oft dies übersehen wird).

Ich werde versuchen, es zu finden, da mich so etwas kratzt. Es wird Ihr Problem nicht lösen, aber zumindest werden wir etwas Gutes für jemanden herausbringen.

Alle 12 Kommentare

Hallo, eine Info für zukünftige Benutzer, falls sie einen Fix benötigen, bevor dieser Fehler beseitigt ist.

Da mein Projekt auf python3 ist , habe ich das Poblem ersetzt:

virtualenv --always-copy

mit

python -m venv --copies

Dies funktioniert unter CentOS 7.x (kein ModuleNotFoundError: No module named '_socket' und ModuleNotFoundError: No module named 'math' ) und entfernt sich im Wesentlichen von virtualenv, was in meinem Projekt sowieso eine praktikable Wahl war.

Der Optionsname hat sich also geändert?
IMO, (wenn die Bedeutung zumindest gleich ist) sollte die (alte) --always-copy Option long als Alias ​​für die (neue) Option --copies . Dies sollte nicht schwierig sein; es war kein Problem für optparse Optionen, wo die erste gefundene lange Optionszeichenfolge diejenige war, die für die Standardeinstellung dest .

Hallo @tobiasherp , nicht genau.

Die beiden Optionen beziehen sich auf unterschiedliche Programme: --always-copy ist eine virtualenv Option, --copies steht für python -m venv .

Was ich getan habe, ist, virtualenv komplett aufzugeben und -m venv das ab Python3 standardmäßig verfügbar ist, ohne dass etwas installiert werden muss, und für meinen Fall gut funktioniert.

ich sehe

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'

Wenn ich versuche, tests/test_virtualenv.py::test_always_copy_option auszuführen

Ich sehe das gleiche Problem bei OpenSUSE 15.0 und 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 Irgendwelche Ideen hier? Ohne --always-copy läuft es korrekt.

Ich habe den venv Workaround ausprobiert und festgestellt, dass er auch dann noch einen Symlink erstellt, wenn --copies verwendet wird. Wieso den?

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 , das ist wahr: /lib64 , wobei python -m venv --copies immer noch ein Symlink ist, aber zum Glück ist das der einzige verbleibende: Versuchen Sie es ohne --copies und sehen Sie sich den Inhalt von . an /lib/pyhon3.6/site-packages : Viele Dateien sind Symlinks.

Ich weiß nicht, ob es für deine Bedürfnisse ausreicht. Für mich bestand der Anwendungsfall darin, sicherzustellen, dass ein Benutzer nicht versehentlich die Dateiberechtigungen in anderen Verzeichnissen durcheinander bringt, während er auf seiner virtuellen Umgebung arbeitet. In diesem Fall ist es akzeptabel, dass /lib64 ein Symlink ist, da er innerhalb der virtualenv-Verzeichnisstruktur bleibt.

Randnotiz: Da Python3 standardmäßig venv , habe ich die Verwendung von virtualenv sowieso ganz eingestellt.

Ich versuche , ein Python env innerhalb WSL auf Windows, in einem Dropbox - Ordner einzurichten, und Dropbox wird von irgendwelchen Symlinks verwirrt. Dies ist der letzte Satz von Symlinks, den ich noch herausfinden kann, und virtualenv war so ziemlich da, hätte es nicht diesen mathematischen Absturz gehabt.

Ich meine, ich könnte venv ein rm und cp -R hinzufügen und versuchen, diesen Weg zu gehen, aber es wäre gut, wenn es tatsächlich das tut, was es sagt, und überhaupt keine Symlinks hätte.

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

Ughhh, es stellt sich heraus, dass venv nicht gut ist, weil es keine Verzeichnisse mit Leerzeichen handhabt.

virtualenv pip hat dies und funktioniert:

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

venv pip hat dies und gibt einen Fehler aus:

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

Bestätigt, dass dieses math Problem mit der neuesten 16.7.7 Version auftritt.

venv pip hat dies und gibt einen Fehler aus:

!"/mnt/c/Users/Artem Russakovskii/Dropbox/workspace/SNIP.test/SNIP/env-linux/bin/python3"

Dies ist ein hässlicher Fehler, den Sie gefunden haben. Vom Aussehen her scheint ein Zitat in einem Bash-Skript zu fehlen (was mich nicht überraschen würde, wenn man bedenkt, wie oft dies übersehen wird).

Ich werde versuchen, es zu finden, da mich so etwas kratzt. Es wird Ihr Problem nicht lösen, aber zumindest werden wir etwas Gutes für jemanden herausbringen.

https://github.com/pypa/virtualenv/pull/1500 sollte dies nun ein für alle Mal lösen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen