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!
$ 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
.
pip list
keluaran$ ~/.pyenv/versions/3.6.9/bin/python -m pip list
Package Version
---------- -------
pip 18.1
setuptools 40.6.2
virtualenv 16.7.2
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.
Komentar yang paling membantu
Sebagai solusinya, Anda dapat menggunakan
python -m lib2to3
di dalam virtualenv Anda, dengan fungsi yang setara.