<p>Virtualenv - فشل النسخ دائمًا في CentOS (مشكلة lib64؟)</p>

تم إنشاؤها على ٥ مارس ٢٠١٩  ·  12تعليقات  ·  مصدر: pypa/virtualenv

يبدو أن إنشاء Virtualenv باستخدام --always-copy على نظام أساسي يستخدم دليل /lib64 أمر مستحيل.

على سينت أو إس 7.6، يحدث نفس الشيء مع كل من حزم النظام (الثعبان 2.7.5، virtualenv 15.1.0) وتلك المثبتة عبر SCL.
هناك بعض التذاكر التي قد تكون مرتبطة (# 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) دون حظ. نقدر أي مساعدة.

bug

التعليق الأكثر فائدة

يحتوي venv pip على هذا وينتج خطأ:

! "/ mnt / c / Users / Artem Russakovskii / 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 كاسم مستعار للخيار (الجديد) --copies . لا ينبغي أن يكون هذا صعبًا ؛ لم تكن هناك مشكلة بالنسبة لخيارات optparse ، حيث تم العثور على سلسلة الخيارات الطويلة الأولى التي تم العثور عليها من أجل 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 موجودًا إلى حد كبير ، لولا حدوث هذا الانهيار الرياضي.

أعني ، يمكنني إضافة rm و cp -R إلى venv ومحاولة السير في هذا الطريق ، لكن سيكون من الجيد أن تفعل ما تقوله بالفعل ولا تحتوي على روابط رمزية على الإطلاق.

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 / Artem Russakovskii / Dropbox / workspace / SNIP.test / SNIP / env-linux / bin / python3"

هذا خطأ قبيح وجدته. من مظهره ، يبدو اقتباسًا مفقودًا في بعض نصوص bash (وهو ما لن يفاجئني ، بالنظر إلى عدد مرات التغاضي عن هذا).

سأحاول العثور عليه ، لأن هذا النوع من الأشياء يخدشني. لن تحل مشكلتك ، لكن على الأقل سنخرج بشيء جيد لشخص ما.

يجب أن يحل https://github.com/pypa/virtualenv/pull/1500 هذا الآن مرة واحدة وإلى الأبد.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات