Bagaimana cara menambahkan jalur ke PYTHONPATH di virtualenv

97

Saya mencoba untuk menambahkan jalur ke variabel lingkungan PYTHONPATH, yang hanya akan terlihat dari lingkungan virtualenv tertentu.

Saya mencoba di SET PYTHONPATH=...bawah prompt perintah virtualenv, tetapi itu menetapkan variabel untuk seluruh lingkungan.

Bagaimana cara mencapai itu?

Flavien
sumber

Jawaban:

155

Anda biasanya dapat menghindari melakukan apa pun dengan PYTHONPATH dengan menggunakan .pthfile . Letakkan saja file dengan ekstensi .pth (nama dasar apa pun berfungsi) di folder paket situs virtualenv Anda, misalnya lib\python2.7\site-packages, dengan jalur absolut ke direktori yang berisi paket Anda sebagai satu-satunya isinya.

Dougal
sumber
Sayangnya ini tidak berfungsi sebagai penimpaan. Itu menambahkan jalur, jadi jika Anda mengembangkannya tidak berhasil.
Erik Aronesty
Juga, jika Anda mengetahui jalur absolut, apa gunanya variabel?
Jamie Marshall
Anda juga dapat menavigasi ke folder paket situs lingkungan virtual Anda dan membuat tautan simbolis ke file .pth seperti ini: ln -s path / to / somfile.pth. Saya menemukan ini berguna ketika saya membutuhkan direktori yang sama agar dapat diakses di beberapa lingkungan virtual
Data-phile
91

Jika Anda menggunakan virtualenv, Anda mungkin juga harus menggunakan virtualenvwrapper , dalam hal ini Anda dapat menggunakan perintah add2virtualenv untuk menambahkan jalur ke jalur Python untuk virtualenv saat ini:

add2virtualenv directory1 directory2 …

penjahat
sumber
3
Bagaimana jika menghapus dari virtualenv?
silverdagger
1
Saya ingin menambahkan komentar ramah bahwa pada host bersama dan situasi serupa pembungkus venv tidak diinginkan. Dalam kasus seperti itu, satu venv berlaku dan semua yang diperlukan membuat pemasangan tambahan tidak diinginkan. Secara lokal hal-hal berbeda, tetapi di server / image KISS sangat penting.
Marc
2
Saya tidak yakin bagaimana perintah bekerja saat ini ditulis, tetapi add2virtualenvtidak mengubah $ PYTHONPATH, melainkan memodifikasi sys.path.
ForeverWintr
1
@ajostergaard: Maaf, saya harus menyediakan sumbernya. Jika Anda melihat kode sumbernya add2virtualenv, Anda dapat melihatnya memodifikasi sys.path. Saya setuju bahwa dokumen membuatnya terdengar seperti itu memodifikasi PYTHONPATHvariabel lingkungan, tetapi tampaknya tidak benar. bitbucket.org/virtualenvwrapper/virtualenvwrapper/src/...
ForeverWintr
1
@ForeverWintr Saya berdiri dikoreksi - file .pth digunakan untuk mengatur sys.path. docs.python.org/2/library/site.html Confused.com!
ostergaard
5

Anda juga dapat mencoba meletakkan symlink ke salah satu virtualenv Anda.

misalnya. 1) aktifkan virtualenv Anda 2) jalankan python 3) impor sys dan periksa sys.path 4) Anda akan menemukan jalur pencarian python di sana. Pilih salah satu dari mereka (mis. Paket-situs) 5) pergi ke sana dan buat symlink ke paket Anda seperti: ln -s path-to-your-package name-with-which-you're-be-importing

Dengan begitu Anda harus dapat mengimpornya bahkan tanpa mengaktifkan virtualenv Anda. Cukup coba: path-to-your-virtualenv-folder / bin / python dan impor paket Anda.

Slavko-t
sumber
Saya kira ini downvoted karena menggunakan symlink daripada file .pth. Itu berhasil untuk saya, jadi, siapa pun.
Gareth Davidson
3

Jika Anda menggunakan virtualenvwrapper,

$ cd to the parent folder
$ add2virtualenv  folder_to_add

konsol akan ditampilkan

Warning: Converting "folder_to_add" to "/absoutle/path/to/folder_to_add"

Itu dia, dan kamu harus pergi

Aneesh Panoli
sumber
1
import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print("current working dir: %s" % dir_path)

sys.path.insert(0, dir_path)

Saya sangat menyarankan Anda menggunakan virtualenv dan virtualenvwrapper untuk menghindari jalan yang berantakan.

Bebek karet
sumber
jika Anda ingin ini bekerja dengan versi python apa pun, cukup gunakan format string gaya lama normal daripada f-string mewah f "... {dir_path}"
Guillaume S
Terima kasih atas komentarnya. Saya merevisi untuk digunakan. cara lama tidak praktis dan istimewa dan tidak ada yang mewah tentang sistem templating sederhana
Rubber Duck
Semuanya relatif :)
Guillaume S