Membuat virtualenv dengan --always-copy
pada platform yang menggunakan direktori /lib64
tampaknya tidak mungkin.
Pada CentOS 7.6, hal yang sama terjadi baik dengan paket sistem (python 2.7.5 , virtualenv 15.1.0 ) dan yang diinstal melalui SCL.
Ada beberapa tiket yang mungkin terkait (#985, #1192, #3477, https://github.com/FPGAwars/icestudio/issues/244), dan permintaan tarik gabungan yang seharusnya memperbaiki masalah (#1189), namun saya memiliki kesan bahwa masih ada sesuatu yang salah terjadi.
Contoh menggunakan SCL (Python 3.6.3 , virtualenv ditingkatkan secara manual ke 16.4.3 ).
Kesalahan pertama tampaknya terjadi di 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'
Log lengkap untuk melihatnya dalam konteks.
$ <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
Saya telah benar-benar mencoba banyak kombinasi (banyak versi, bermain dengan PATH dan PYTHONPATH) tanpa hasil. Setiap bantuan dihargai.
Hai, info untuk pengguna masa depan, jika mereka membutuhkan perbaikan sebelum bug ini dihancurkan.
Karena proyek saya menggunakan python3 , saya menghindari masalah dengan mengganti:
virtualenv --always-copy
dengan
python -m venv --copies
Ini berfungsi pada CentOS 7.x (tidak ModuleNotFoundError: No module named '_socket'
dan ModuleNotFoundError: No module named 'math'
), dan pada dasarnya menjauh dari virtualenv, yang merupakan pilihan yang layak dalam proyek saya.
Jadi nama opsi telah berubah?
IMO, (jika artinya sama, setidaknya) opsi panjang --always-copy
lama) harus didukung sebagai alias untuk opsi --copies
(baru) . Ini seharusnya tidak sulit; tidak ada masalah untuk opsi optparse
, di mana string opsi panjang pertama yang ditemukan adalah yang diambil untuk default dest
.
Hai @tobiasherp , tidak persis.
Kedua opsi merujuk ke program yang berbeda: --always-copy
adalah opsi virtualenv
, --copies
adalah untuk python -m venv
.
Apa yang saya lakukan adalah membuang virtualenv sama sekali, dan menggunakan -m venv
yang, mulai dari python3, tersedia secara default tanpa perlu menginstal apa pun, dan berfungsi dengan baik untuk kasus saya.
saya mengerti
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'
Ketika saya mencoba menjalankan tests/test_virtualenv.py::test_always_copy_option
Saya melihat masalah yang sama pada OpenSUSE 15.0 dan 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 Ada ide di sini? Tanpa --always-copy
, itu berjalan dengan benar.
Saya mencoba solusi venv
dan ternyata masih membuat symlink bahkan ketika --copies
digunakan. Mengapa?
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 , itu benar: /lib64
, dengan python -m venv --copies
masih symlink, tapi untungnya itu satu-satunya yang tersisa: coba jalankan tanpa --copies
dan lihat isinya /lib/pyhon3.6/site-packages
: banyak file akan menjadi symlink.
Saya tidak tahu apakah itu cukup untuk kebutuhan Anda. Bagi saya, use case memastikan bahwa pengguna tidak secara tidak sengaja mengacaukan izin file di direktori lain saat mengoperasikan virtualenv-nya. Dalam hal ini dapat diterima bahwa /lib64 adalah symlink, karena tetap berada dalam struktur direktori virtualenv.
Catatan tambahan: dengan python3 telah tersedia venv
secara default, saya tetap berhenti menggunakan virtualenv sama sekali.
Saya mencoba mengatur env Python di dalam WSL di Windows, di folder Dropbox, dan Dropbox bingung dengan symlink apa pun . Ini adalah set symlink terakhir yang tersisa untuk saya ketahui, dan virtualenv cukup banyak di sana, seandainya tidak mengalami crash matematika ini.
Maksud saya, saya dapat menambahkan rm dan cp -R ke venv dan mencoba menempuh rute itu, tetapi akan lebih baik jika itu benar-benar melakukan apa yang dikatakannya dan tidak memiliki symlink sama sekali.
python3 -m venv --copies env-linux && rm env-linux/lib64 && cp -R env-linux/lib env-linux/lib64
Ughhh, ternyata venv
tidak bagus karena tidak menangani dir dengan spasi.
virtualenv pip memiliki ini dan berfungsi:
#!/bin/sh
'''exec' "/mnt/c/Users/Artem Russakovskii/Dropbox/workspace/SNIP.test/SNIP/env-linux/bin/python3" "$0" "$@"
' '''
venv pip memiliki ini dan menampilkan kesalahan:
#!"/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
Mengonfirmasi bahwa masalah math
ini ada menggunakan versi 16.7.7
terbaru.
venv pip memiliki ini dan menampilkan kesalahan:
!"/mnt/c/Users/Artem Russakovskii/Dropbox/workspace/SNIP.test/SNIP/env-linux/bin/python3"
Ini adalah bug jelek yang Anda temukan. Dari tampilannya, tampaknya ada kutipan yang hilang dalam beberapa skrip bash (yang tidak akan mengejutkan saya, mengingat seberapa sering ini diabaikan).
Saya akan mencoba menemukannya, karena hal semacam ini membuat saya gatal. Itu tidak akan menyelesaikan masalahmu, tapi setidaknya kita akan keluar dengan sesuatu yang baik untuk seseorang.
https://github.com/pypa/virtualenv/pull/1500 harus menyelesaikan ini sekarang untuk selamanya.
Komentar yang paling membantu
Ini adalah bug jelek yang Anda temukan. Dari tampilannya, tampaknya ada kutipan yang hilang dalam beberapa skrip bash (yang tidak akan mengejutkan saya, mengingat seberapa sering ini diabaikan).
Saya akan mencoba menemukannya, karena hal semacam ini membuat saya gatal. Itu tidak akan menyelesaikan masalahmu, tapi setidaknya kita akan keluar dengan sesuatu yang baik untuk seseorang.