<p>virtualenv --always-copy gagal pada CentOS (masalah lib64?)</p>

Dibuat pada 5 Mar 2019  ·  12Komentar  ·  Sumber: pypa/virtualenv

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.

bug

Komentar yang paling membantu

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.

Semua 12 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat