يبدو أن إنشاء 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) دون حظ. نقدر أي مساعدة.
مرحبًا ، معلومات للمستخدمين في المستقبل ، في حالة احتياجهم إلى إصلاح قبل تحطيم هذا الخطأ.
نظرًا لأن مشروعي على 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 هذا الآن مرة واحدة وإلى الأبد.
التعليق الأكثر فائدة
هذا خطأ قبيح وجدته. من مظهره ، يبدو اقتباسًا مفقودًا في بعض نصوص bash (وهو ما لن يفاجئني ، بالنظر إلى عدد مرات التغاضي عن هذا).
سأحاول العثور عليه ، لأن هذا النوع من الأشياء يخدشني. لن تحل مشكلتك ، لكن على الأقل سنخرج بشيء جيد لشخص ما.