Bagaimana cara global memodifikasi PYTHONPATH default (sys.path)?

33

Pada sistem Ubuntu (10.10), saya memiliki paket Python yang menginstal sendiri /usr/local/lib/python2.6/site-packages/. Ini tidak terkandung dalam jalur default (sys.path). Bagaimana cara menambahkan direktori ini ke jalur?

Mengatur $PYTHONPATHvariabel lingkungan adalah solusi, tentu saja, tapi saya mencari cara yang lebih elegan untuk melakukan ini. Sebagai contoh easy_installjuga meletakkan paket yang diinstal di dalamnya, sys.path saya terlihat seperti ini:

['', '/usr/local/lib/python2.6/dist-packages/keyring-0.5.1-py2.6.egg', 
'/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk',  
'/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', 
'/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', 
'/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/pymodules/python2.6', 
'/usr/lib/pymodules/python2.6/gtk-2.0']

jadi path jelas bukan default yang dibangun ke dalam biner Python.

Apakah ada file konfigurasi tunggal yang berisi entri di atas? Atau dengan cara apa dimungkinkan untuk memodifikasinya?

Latanius
sumber

Jawaban:

27

The dokumentasi situs modul dan Memodifikasi Python Cari Jalan tampaknya apa yang Anda cari.

Sejauh yang saya mengerti, entri-entri itu ditambahkan sys.patholeh:

  • /usr/lib/python2.6/site.py
  • /usr/lib/python2.6/dist-packages/site.py
    (Ubah 2.6 ke versi Python Anda.)

Cara termudah untuk mengubahnya adalah dengan menambahkan file yang /usr/local/lib/python2.6/dist-packages/site-packages.pthberisi ../site-packages.

Atau, mungkin Anda bisa mengajarkan paket untuk digunakan site.getsitepackages()?

Mikel
sumber
1
terima kasih, bekerja dengan sempurna :) (Saya akhirnya menambahkan file .pth ke /usr/local/python2.6/dist-packages, mengandung "../site-packages")
Latanius
1
Anda juga dapat membuat modul bernama sitecustomize.pyyang site.pymencoba mengimpor dan memodifikasi di sys.pathsana.
TestUser16418
5

Anda dapat membuat file baru yang disebut /etc/profile.d/local_python.shdengan konten

PYTHONPATH="/usr/local/lib/python2.6/site-packages/":"${PYTHONPATH}"
export PYTHONPATH

Yang akan mengatur PYTHONPATHvariabel untuk semua pengguna yang masuk di sistem Anda.

TestUser16418
sumber
7
Ini benar-benar tidak universal. Mekanisme /etc/profile.d hanya akan berfungsi untuk shell login untuk orang dengan shell yang menggunakan /etc/profile.d (bash / ksh / zsh). Saya yakin pengguna csh tidak akan melihat perubahan ini. Juga, akan diabaikan di cron / di pekerjaan.
Rich Homolka
2
ini adalah cara yang bagus untuk mengatur variabel lingkungan global (namun hal lain yang saya pelajari hari ini), tetapi seperti yang saya sebutkan di posting, saya mencari cara yang lebih Pythonic :)
Latanius
4

Saya ingin merangkum temuan saya tentang modifikasi jalur python. Ada dua cara untuk melakukannya.

  • file .pth
  • PYTHONPATH

File .pth apa pun yang ditemukan di jalur default (lihat di bawah) akan memasukkan kontennya sys.path. Format file .pth tersebut sederhana: satu jalur (folder) per baris. Anehnya, jalur bisa absolut atau relatif terhadap file .pth .

Path default adalah tempat interpreter berada dan di <some-prefix>/lib/python<version>/site-packagesmana <some-prefix>biasanya /usr/.

PYTHONPATHadalah variabel lingkungan dari sistem operasi Anda. Pada sistem unix Anda daftar mereka env. Modifikasi global dari variabel tersebut dilakukan melalui skrip .sh di dalam /etc/profile.d/folder seperti yang disebutkan oleh @ TestUser16418.

katomaso
sumber
2
Ini adalah PYTHONPATH tanpa "_"
heroxbd
1

Misalnya, jika Anda ingin mengimpor sudsmodul yang tersedia sebagai .eggfile:

egg_path = '/home/shahid/suds_2.4.egg'

sys.path.append(egg_path)

import suds
# ... rest of code
Mohammad Shahid Siddiqui
sumber