Variabel lingkungan PYTHONPATH ... bagaimana cara membuat setiap subdirektori setelahnya?

9

Saat ini saya melakukan ini:

PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff

Bagaimana saya membuatnya sehingga PYTHONPATH dapat memasukkan semua subdirektori?

PYTHONPATH = /home/$USER/....and-all-subdirectories
Alex
sumber

Jawaban:

14

Bukan itu cara PYTHONPATH bekerja; PYTHONPATH memperlakukan jalur pencariannya secara berbeda dari PATH shell. Katakanlah saya melakukan ini:

$ mkdir /home/jsmith/python
$ cd /home/jsmith/python
$ touch a.py b.py

Ini akan berfungsi, dengan Python ( sys.pathakan termasuk direktori saat ini):

$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6

Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
>>> import a, b   # Works
>>> quit()

Namun, subdirektori diperlakukan sebagai paket bila __init__.pyada dalam direktori, dan diabaikan oleh PYTHONPATH jika tidak:

$ mkdir /home/jsmith/python/pkg
$ cd /home/jsmith/python/pkg
$ touch __init__.py c.py d.py
$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6

Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
>>> import a, b   # Works
>>> import c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named c

Untuk mendapatkan sesuatu di subdirektori itu, ini akan berhasil:

>>> from pkg import c   # Works
>>> import pkg.c        # Works

Untuk menggulung solusi di mana setiap subdirektori dalam PYTHONPATH Anda ditambahkan, Anda perlu menambahkan setiap folder secara eksplisit ke PYTHONPATH atau secara sys.pathterprogram. Perilaku ini disengaja, dan tidak berperilaku seperti shell PATH. Mengingat dukungan penerjemah untuk paket dalam hal ini, tentunya ada cara yang lebih baik untuk mencapai apa yang Anda cari?

Jed Smith
sumber
3
Man, saya berharap setiap situs akan memeriksa akun Anda yang lain sebelum menolak Anda memposting hak istimewa. Menyebalkan dimulai dengan perwakilan, terutama dengan hal-hal seperti batas satu-URL ... (Saya punya lebih banyak referensi untuk Anda, OP)
Jed Smith
1

Itu bukan cara kerja variabel PATH lingkungan - Anda memberikannya direktori tingkat atas dan terserah aplikasi untuk mengulang pohon direktori jika perlu.

EEAA
sumber
Jadi, jika saya memiliki file python di /home/$USER/myfile.py Dapatkah saya mengimpor ini?
Alex
Tentu, mengapa Anda tidak bisa?
EEAA
1

Dimungkinkan untuk menambahkan subdirektori dari sebuah direktori ke variabel PYTHONPATH Anda menggunakan shell, tentu saja. Saat ini saya menggunakan sesuatu yang mirip dengan yang berikut ini di .bashrc saya:

export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"

Ini akan mencakup semua subdirektori dari folder pengguna Anda hingga kedalaman 2 di pohon. Perintah find menempatkan direktori ('-type d'), dan perintah sed dan tr berikut memformat output dengan cara yang biasa dari variabel PATH.

Meninggalkan '-maxdepth 2' akan mencakup semua subdirektori dari folder beranda Anda, yang mungkin cukup banyak untuk dicari. Mungkin ini hanya boleh dilakukan di direktori $ HOME / repositori / python-stuff Anda.

putar
sumber