Virtualenv: Sertakan skrip Perpustakaan Standar dalam skrip virtualenv

Dibuat pada 2 Agu 2019  ·  22Komentar  ·  Sumber: pypa/virtualenv

Sepertinya 2to3 saat ini tidak dialihkan oleh Virtualenv. Lihat https://travis-ci.community/t/2to3-command-not-found-in-virtualenv-in-bionic/4495 untuk kasus ketika ini tidak terduga oleh pengguna -- karena biasanya tersedia di PATH untuk instalasi Linux.

Mengingat Py2 mendekati EOL, permintaannya akan meningkat!


  • [X] Contoh minimal yang dapat direproduksi atau deskripsi detail
$ which 2to3
/home/vmuser/.pyenv/shims/2to3

$ pyenv install 3.6.9
<...>

$ ~/.pyenv/versions/3.6.9/bin/python -m pip install virtualenv
Collecting virtualenv
  Downloading https://files.pythonhosted.org/packages/db/9e/df208b2baad146fe3fbe750eacadd6e49bcf2f2c3c1117b7192a7b28aec4/virtualenv-16.7.2-py2.py3-none-any.whl (3.3MB)
    100% |████████████████████████████████| 3.3MB 1.3MB/s 
Installing collected packages: virtualenv
Successfully installed virtualenv-16.7.2

$ ~/.pyenv/versions/3.6.9/bin/python -m virtualenv test
Using base prefix '/home/vmuser/.pyenv/versions/3.6.9'
New python executable in /home/vmuser/test/bin/python
Installing setuptools, pip, wheel...
done.

$ . test/bin/activate

(test) $ which 2to3
/home/vmuser/.pyenv/shims/2to3

Perilaku yang diharapkan adalah untuk which terakhir untuk mengembalikan jalur di dalam virtualenv -- sama seperti misalnya python dan pip .

  • [X] OS dan pip list keluaran
    Ubuntu Bionic Desktop x64
$ ~/.pyenv/versions/3.6.9/bin/python -m pip list
Package    Version
---------- -------
pip        18.1   
setuptools 40.6.2 
virtualenv 16.7.2 
enhancement help-wanted

Komentar yang paling membantu

Sebagai solusinya, Anda dapat menggunakan python -m lib2to3 di dalam virtualenv Anda, dengan fungsi yang setara.

Semua 22 komentar

Apakah ini masih terjadi setelah melakukan pyenv rehash?

Apa yang dijalankan shim saat dijalankan sebelum atau sesudah pyenv rehash?

Saya merasa ini ada hubungannya dengan pyenv.

Apakah ini masih terjadi setelah melakukan pyenv rehash?

Ya.

Apa yang dijalankan shim saat dijalankan sebelum atau sesudah pyenv rehash?

Karena system Python dipilih yang paket apt dengan 2to3 tidak diinstal, katanya

pyenv: 2to3: command not found

The `2to3' command exists in these Python versions:
<list>

dalam kedua kasus.

Saya merasa ini ada hubungannya dengan pyenv.

pyenv tidak relevan. Perilaku yang diharapkan adalah which kedua untuk mengembalikan virtualenv 's shim seperti yang dilakukannya untuk python . Bugnya adalah virtualenv tidak membuatnya. (Saya pikir ini sudah jelas. Mungkin tidak.)

Ah, oke... Apa PATH setelah aktivasi?

(Saya tidak menggunakan mesin di mana saya dapat mencoba mereproduksi ini sekarang)

(test) vmuser<strong i="5">@ubuntuvm</strong>:~$ echo $PATH
/home/vmuser/test/bin:/home/vmuser/.rbenv/shims:/home/vmuser/.rbenv/bin:/home/vmuser/.pyenv/shims:/home/vmuser/.pyenv/bin:/home/vmuser/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/vmuser/.rvm/bin
(test) vmuser<strong i="6">@ubuntuvm</strong>:~$ ls /home/vmuser/test/bin
activate       activate_this.py  pip     python3
activate.csh   activate.xsh      pip3    python3.6
activate.fish  easy_install      pip3.6  python-config
activate.ps1   easy_install-3.6  python  wheel

Sebagai solusinya, Anda dapat menggunakan python -m lib2to3 di dalam virtualenv Anda, dengan fungsi yang setara.

/cc lainnya @pypa/virtualenv-committers jika mereka berpikir menambahkan skrip dari pustaka standar ke virtualenv saat membuatnya, adalah ide yang bagus.

Aku ambivalen.

saya -0,5. Ini adalah kekacauan ekstra yang belum ditandai sebagai masalah sampai sekarang, jadi saya menganggap kebutuhan itu jarang terjadi. Saya tidak yakin bahwa Python 2 yang mendekati EOL membuat perbedaan di sini. Skrip tambahan tidak ada di PATH di lingkungan non-virtual di Windows, jadi tidak seperti harapan bahwa mereka hadir bersifat universal.

Saya pikir ini harus bekerja sebagai pendekatan umum. Semua aplikasi di lingkungan host harus tersedia di tingkat lingkungan virtual.

Saya tidak yakin bahwa Python 2 yang mendekati EOL membuat perbedaan di sini.

+1

Itu juga bukan urusan saya di sini. :)

Skrip tambahan juga tidak ada di PATH di lingkungan non-virtual di Windows

Oh. Bukankah ini ada di direktori Scripts/ ? Pemahaman saya adalah bahwa penginstal python.org saat ini menambahkan direktori itu ke PATH dan dengan demikian mereka dapat dieksekusi.

Semua aplikasi di lingkungan host harus tersedia di tingkat lingkungan virtual.

Uhm... "aplikasi" agak kabur di sini -- apakah Anda mengacu pada skrip atau yang lainnya? Bisakah Anda menjelaskan apa yang Anda maksud?

Perhatikan bahwa jika kita melakukan ini, saya -1 kuat dalam menyertakan semua skrip dari lingkungan Host dan ambivalen untuk menyertakan skrip yang didukung oleh pustaka standar.

Oh. Bukankah ini ada di direktori Scripts/?

Tidak, semua yang ada di Scripts adalah pembungkus titik masuk untuk pustaka yang diinstal (pip, easy_install, dan wheel in base install). Melihat sedikit lebih jauh, 2to3.py ada di Tools/scripts (bersama dengan sekelompok 60+ skrip lain yang cukup beragam), tetapi direktori itu tidak diletakkan di PATH , bahkan jika pengguna memilih "Tambahkan Python ke PATH Anda".

Perhatikan bahwa jika kita melakukan ini, saya -1 kuat dalam menyertakan semua skrip dari lingkungan Host dan ambivalen untuk menyertakan skrip yang didukung oleh pustaka standar.

Setidaknya, saya berpendapat bahwa kita tidak boleh menambahkan lebih banyak ke PATH daripada instalasi dasar. Artinya, meskipun kami melakukan ini, kami tidak melakukannya di Windows.

pradyunsg mengubah judul Sertakan skrip Perpustakaan Standar di tempat sampah virtualenv/ Sertakan skrip Perpustakaan Standar dalam skrip virtualenv 2 jam yang lalu

Hanya mencatat bahwa ini adalah sedikit perubahan ruang lingkup. OP hanya secara khusus tertarik pada 2to3 , dan khususnya bahwa mengaktifkan virtualenv tidak membayangi sistem 2to3 . Apakah itu penting, saya tidak dapat berkomentar (mengingat bahwa saya berpendapat bahwa ini tidak terjadi pada Windows, saya tidak memiliki pengalaman yang relevan di Unix untuk mengatakan apakah saya merasa ini adalah masalah). Tetapi tanpa mengetahui skrip lain apa yang "skrip Perpustakaan Standar" saya tidak dapat berkomentar jika ini adalah poin yang signifikan.

Hmm, pyvenv mungkin adalah "skrip Perpustakaan Standar" lainnya, dan saya cukup yakin kami tidak ingin membayangi versi sistem itu dengan yang menjalankan venv dari lingkungan virtualenv (karena itu hanya menyebabkan komplikasi tanpa manfaat praktis).

OP itu... tertarik... khususnya bahwa mengaktifkan virtualenv tidak membayangi sistem 2to3.

(Saya tidak yakin apa yang dimasukkan frasa ini ke dalam mulut saya, itu bisa ditafsirkan dua arah.)

Untuk kejelasan, saya meminta virtualenv untuk membuat shim untuk 2to3 .

(Biarkan saya mengedit posting asli dengan perilaku yang diharapkan, saya melihat bahwa saya menghilangkannya menyebabkan kebingungan.)

(Biarkan saya mengedit posting asli dengan perilaku yang diharapkan)

Selesai. Saya juga mengklarifikasi mengapa pengguna mengharapkannya pada PATH .

Saya tidak yakin apa yang dimasukkan frasa ini ke dalam mulut saya

Maaf karena salah mengartikan komentar Anda dan terima kasih atas klarifikasinya! (Sepertinya saya benar-benar memahami apa yang Anda minta, saya baru saja menyatakannya dengan buruk ...)

Saya juga mengklarifikasi mengapa pengguna mengharapkannya ada di PATH.

Tautan yang Anda rujuk agak membingungkan. Pengguna tampaknya memiliki proses yang bekerja pada tepercaya dan xenial, tetapi tidak pada bionik. Tidak jelas bagi saya mengapa itu terjadi jika masalahnya ada di virtualenv. (Catatan: ini adalah penyimpangan - terlepas dari itu, jelas bahwa virtualenv tidak menyalin 2to3.py , jadi diskusi apakah kita harus valid bahkan jika masalah aslinya lebih halus).

Saya meminta virtualenv untuk membuat shim untuk 2to3.

Perhatikan bahwa kita tidak akan pernah membuat shim. Yang akan kita lakukan hanyalah menyalin skrip 2to3.py . Jika shim diperlukan (itu masalah pyvenv, saya pikir) maka bukan kita yang menanganinya.

Tidak, semua yang ada di Script adalah pembungkus titik masuk untuk pustaka yang diinstal (pip, easy_install, dan wheel in base install).

oooooooooooo. Baik.

Hanya mencatat bahwa ini adalah sedikit perubahan ruang lingkup.

Saya tidak berpikir 2to3 adalah kepingan salju khusus -- jika kita menambahkannya, saya berharap seseorang akan datang meminta sisanya. Kita harus melakukan ini sepenuhnya atau tidak sama sekali. Terjebak di tengah jalan bukanlah sesuatu yang kami inginkan di sini.

(Saya benci UI seluler)

Ini "khusus" karena didukung oleh perpustakaan standar DAN dalam PATH untuk instalasi Linux standar.
Sebenarnya tidak banyak alat lain seperti ini. Selain 2to3 , hanya pydoc , idle dan pyvenv :

$ ls ~/.pyenv/versions/3.6.9/bin
2to3          easy_install-3.6  idle3.6  pip3.6  pydoc3.6  python3.6         python3.6m         python-config  virtualenv
2to3-3.6      idle              pip      pydoc   python    python3.6-config  python3.6m-config  pyvenv
easy_install  idle3             pip3     pydoc3  python3   python3.6-gdb.py  python3-config     pyvenv-3.6

(juga python-config yang sudah dialihkan)

Ah, terima kasih atas klarifikasinya @native-api! Sangat dihargai. Seiring dengan penjelasan @pfmoore tentang bagaimana ini bukan masalah Windows, itu membantu pemahaman saya. :)

Saya masih ragu untuk memasukkannya.

Selain 2to3, hanya pydoc, idle, dan pyvenv

Saya ingin tahu siapa yang memilih daftar itu. Apakah ini khusus pyvenv? Ubuntu (bash pada Windows, dan gambar buruh pelabuhan dengan python3 diinstal) tampaknya tidak memiliki 2to3 secara default, meskipun gambar buruh pelabuhan Python memiliki binari yang sama yang Anda sebutkan (ditambah pip, easy_install dan wheel, yang berasal dari paket yang diinstal). Tampaknya agak tergantung pada distribusi :-( Setidaknya daftar binari yang relevan tampaknya konsisten.

BTW, seperti yang saya katakan di atas, bahkan jika kami melakukan perubahan ini, saya sangat menyarankan untuk tidak menyertakan pyvenv.

Ubuntu (bash pada Windows, dan gambar buruh pelabuhan dengan python3 diinstal) tampaknya tidak memiliki 2to3 secara default

Itu karena di Ubuntu, 2to3 dipindahkan ke paket terpisah:

$ apt-file search 2to3 | grep -E '/2to3[^/]*$'
2to3: /usr/bin/2to3
<...>
python2.7: /usr/bin/2to3-2.7
<...>

Dengan "instalasi Linux standar", maksud saya logika yang intrinsik dengan skrip build Linux Python, tanpa campur tangan distro -- misalnya jika Anda menginstal dari sumber (yang dilakukan pyenv ).

Aku bisa mengambil ini dan akan mencoba untuk bekerja pada ini.

Catatan, ini akan menggantikan peretasan kami saat ini untuk menambahkan pydoc sebagai bagian dari skrip aktivasi.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat