Tambahkan direktori secara permanen ke PYTHONPATH?

324

Setiap kali saya menggunakan sys.path.append, direktori baru akan ditambahkan. Namun, setelah saya menutup python, daftar akan kembali ke nilai sebelumnya (default?). Bagaimana cara menambahkan direktori secara permanen PYTHONPATH?

John Howard
sumber

Jawaban:

135

Anda perlu menambahkan direktori baru Anda ke variabel lingkungan PYTHONPATH, dipisahkan oleh titik dua dari konten sebelumnya. Dalam segala bentuk Unix, Anda dapat melakukannya dalam skrip startup yang sesuai dengan shell apa pun yang Anda gunakan ( .profileatau apa pun, tergantung pada shell favorit Anda) dengan perintah yang, sekali lagi, tergantung pada shell yang dimaksud; di Windows, Anda dapat melakukannya melalui sistem GUI untuk tujuan tersebut.

superuser.com mungkin merupakan tempat yang lebih baik untuk bertanya lebih lanjut, yaitu untuk rincian lebih lanjut jika Anda perlu spesifik tentang cara memperkaya variabel lingkungan di platform dan shell yang Anda pilih, karena itu sebenarnya bukan pertanyaan pemrograman.

Alex Martelli
sumber
8
Errata: pemisah pada windows akan titik koma. Jika Anda perlu mengganti jalur sistem di windows, pengaturan melalui GUI sebagai variabel lingkungan pengguna mungkin tidak cukup, karena variabel pengguna ditambahkan ke variabel sistem. Dalam kasus ini, Anda harus menggunakan skrip startup yang membuat penyesuaian yang diperlukan.
Nathan Ernst
1
@ Nathan, tx untuk pengingat pada titik koma, tetapi (jika Anda seorang admin tentu saja) Anda dapat mengatur sistem env.vars pada windows (ditambah, OP tidak menanyakan bagaimana untuk menimpa jalan, hanya bagaimana menambahkan untuk itu , jadi, pengguna env.var juga akan baik-baik saja untuk itu! -).
Alex Martelli 4-10
sayangnya saya bukan admin di PC pekerjaan saya, jadi saya harus mengambil langkah-langkah seperti itu. :(
Nathan Ernst
439

Jika Anda menggunakan bash (pada distro Mac atau GNU / Linux), tambahkan ini ke ~/.bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path"
awesomo
sumber
28
Ini berfungsi dengan baik untuk saya, tetapi pastikan direktori yang Anda tuju memiliki file init .py teratas dalam struktur direktori Anda. Awalnya ini tidak begitu jelas bagi saya. Misalnya, saya mencoba mengekspor PYTHONPATH = $ PYTHONPATH: / Users / joey / repos tetapi tidak berfungsi karena direktori repos saya tidak memiliki _ init_ .py. Turun satu direktori lebih lanjut: / Users / joey / repos / specificRepo melakukan trik. Sekarang python dapat melintasi direktori ke bawah yang terhubung ke direktori specificRepo yang berisi init .py!
Qiao Yi
3
ini bekerja untuk saya tetapi bisakah Anda menjelaskan di mana variabel PYTHONPATH ini berada? dan bagaimana "ekspor PYTHONPATH" tahu untuk menemukan file yang tepat itu?
appleLover
42
ingat setelah Anda mengedit ~/.bashrclalu jalankan, source ~/.bashrclihat stackoverflow.com/questions/2518127/…
b_dev
2
Saya pikir ini ide buruk untuk meletakkannya sudo sudi awal file .bashrc Anda. Posting ini setuju dengan saya. Di sistem saya, setidaknya, itu bahkan tidak perlu.
LondonRob
Ini jawabannya.
Aerin
88

Alih-alih memanipulasi PYTHONPATHAnda juga dapat membuat file konfigurasi jalur . Pertama cari tahu di direktori mana Python mencari informasi ini:

python -m site --user-site

Untuk beberapa alasan ini sepertinya tidak berfungsi di Python 2.7. Di sana Anda dapat menggunakan:

python -c 'import site; site._script()' --user-site

Kemudian buat .pthfile di direktori yang berisi jalur yang ingin Anda tambahkan (buat direktori jika tidak ada).

Sebagai contoh:

# find directory
SITEDIR=$(python -m site --user-site)

# create if it doesn't exist
mkdir -p "$SITEDIR"

# create new .pth file with our path
echo "$HOME/foo/bar" > "$SITEDIR/somelib.pth"
sth
sumber
Saya sudah mencoba ini menggunakan Python 2.6 dan sepertinya tidak berhasil bagi saya
Lorcan O'Neill
4
Saya baru saja menghubungkan direktori ini dengan direktori perpustakaan saya sendiri dan menyimpan semua skrip saya di sana. Bekerja dengan baik.
firesofmay
Putuskan untuk mencobanya lagi setelah menemukan topik ini lagi dan berhasil membuatnya berfungsi seperti di atas kali ini! Terpilih dan meminta maaf :)
Lorcan O'Neill
Karya ini hanya sempurna, aku berada di jalur yang benar tetapi python -m site --user-sitedan (create the directory if it doesn't exist)bagian adalah apa yang saya hilang untuk membuatnya bekerja.
Aurélien Ooms
1
Apakah saya perlu mengambil langkah tambahan agar python mengenali jalur yang ditambahkan somelib.pth? Jika tidak, ada tebakan mengapa ini tidak berhasil?
Miladiouss
38

Ini berfungsi pada Windows

  1. Pada Windows, dengan Python 2.7 pergi ke folder pengaturan Python.
  2. Buka paket Lib / situs.
  3. Tambahkan file kosong example.pth ke folder ini.
  4. Tambahkan jalur yang diperlukan ke file, satu per setiap baris.

Kemudian Anda akan dapat melihat semua modul dalam jalur tersebut dari skrip Anda.

auserdude
sumber
3
IMO, ini adalah solusi terbaik, karena tidak tergantung pada pilihan shell atau lingkungan kerja. Bekerja di linux juga, di mana jalur python default adalah "/usr/local/lib/pythonX.Y/site-packages". Jika itu tidak berhasil, coba letakkan file .pth Anda ke direktori dist-paket sebagai gantinya.
matus
1
Windows 7, Python 3.6.5. Ini jawabannya. Seperti yang ditulis auserdude: Buat "example.pth" di folder Lib / situs-paket Python dan kemudian tambahkan path Anda seperti: C: \ somefolder \ anotherfolder \ anotherfolder \ targetfolder
JayJay123
jawaban yang sangat baik, juga bekerja dengan python 3.7 di windows 10, jalur windows 10 saya adalah: "C: \ Users \ {usrName} \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib"
Ali80
Dapat mengonfirmasi bahwa itu berfungsi untuk Python 3.6.7 di Windows 10. Namun, perhatikan bahwa path ditambahkan ke PYTHONPATH Anda dengan cara bahwa modul yang ditambahkan tidak akan ditemukan dalam kasus tabrakan nama.
BramAppel
25

Jika ada yang masih bingung - jika Anda menggunakan Mac, lakukan hal berikut:

  1. Buka Terminal
  2. Tipe open .bash_profile
  3. Di file teks yang muncul, tambahkan baris ini di akhir: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. Simpan file, restart Terminal, dan Anda selesai
entrepaul
sumber
2
Siapa pun yang bertanya-tanya bagaimana cara melihat jalur python, gunakan: python yang mana
Arindam Roychowdhury
cukup yakin Anda perlu memuat ulang terminal juga
Pengguna
sebenarnya exportkuncinya adalah hal yang saya hilang !!!!, terangkat, terima kasih banyak!
a_m_dev
21

Anda bisa menambahkan path melalui file pythonrc Anda, yang secara default adalah ~ / .pythonrc di linux. yaitu.

import sys
sys.path.append('/path/to/dir')

Anda juga dapat mengatur PYTHONPATHvariabel lingkungan, dalam file rc global, seperti ~/.profilepada mac atau linux, atau melalui Control Panel -> System -> tab Advanced -> Variabel Lingkungan di windows.

Paprika biru
sumber
40
sys.path.append ('/ path / to / dir') tidak secara permanen menambahkan entri.
jeremyjjbrown
15

Untuk memberikan sedikit penjelasan, Python akan secara otomatis membangun jalur pencariannya (seperti yang disebutkan di atas dan di sini ) menggunakan site.pyskrip (biasanya terletak di sys.prefix + lib/python<version>/site-packagesjuga lib/site-python). Seseorang dapat memperoleh nilai sys.prefix:

python -c 'import sys; print(sys.prefix)'

Script site.py kemudian menambahkan sejumlah direktori, tergantung pada platform, seperti /usr/{lib,share}/python<version>/dist-packages, /usr/local/lib/python<version>/dist-packageske jalur pencarian dan juga mencari jalur ini untuk <package>.pthfile konfigurasi yang berisi jalur pencarian tambahan khusus. Misalnya instal mudah memelihara koleksi paket yang diinstal yang ditambahkan ke file sistem tertentu misalnya di Ubuntu itu /usr/local/lib/python2.7/dist-packages/easy-install.pth. Pada sistem tipikal ada banyak file .pth di sekitarnya yang dapat menjelaskan beberapa jalur tak terduga di sys.path:

python -c 'import sys; print(sys.path)'

Jadi seseorang dapat membuat file .pth dan memasukkan direktori ini (termasuk sitedir seperti yang disebutkan di atas ). Ini tampaknya menjadi cara sebagian besar paket ditambahkan ke sys.path daripada menggunakan PYTHONPATH.

Catatan: Di OSX ada jalur pencarian tambahan khusus yang ditambahkan oleh site.py untuk 'framework builds' (tetapi tampaknya berfungsi untuk penggunaan baris perintah normal dari python): /Library/Python/<version>/site-packages(misalnya untuk Python2.7:) /Library/Python/2.7/site-packages/yang merupakan tempat paket pihak ke-3 seharusnya digunakan untuk diinstal (lihat README di dir itu). Jadi seseorang dapat menambahkan file konfigurasi jalur di sana yang berisi jalur pencarian tambahan, misalnya membuat file bernama /Library/Python/2.7/site-packages/pip-usr-local.pthyang berisi /usr/local/lib/python2.7/site-packages/dan kemudian sistem python akan menambahkan path pencarian itu.

Pierz
sumber
10

Bagi saya itu berfungsi ketika saya mengubah .bash_profilefile. Hanya mengubah .bashrcfile hanya berfungsi sampai saya me-restart shell.

Untuk python 2.7 akan terlihat seperti:

export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"

di akhir .bash_profilefile.

Peter Piper
sumber
1
Jika saya mengerti benar ini akan mengekspor variabel untuk sesi Python yang diluncurkan melalui terminal saja kan?
jxramos
1
@ jxramos - ya!
Peter Piper
9

Di linux Anda dapat membuat tautan simbolis dari paket Anda ke direktori PYTHONPATH tanpa harus berurusan dengan variabel lingkungan. Sesuatu seperti:

ln -s /your/path /usr/lib/pymodules/python2.7/
Zah
sumber
7

Menambahkan export PYTHONPATH="${PYTHONPATH}:/my/other/path"ke ~ / .bashrc mungkin tidak berfungsi jika PYTHONPATHsaat ini tidak ada (karena :).

export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"

Menambahkan hal di atas ke ~ / .bashrc saya berhasil di Ubuntu 16.04

Boyangeor
sumber
Saya lakukan echo PYTHONPATHdan tidak ada yang muncul! itu berarti PYTHONPATH ini belum diinisialisasi, jadi saya hanya menempelkan baris ini export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detectiondi ~/.bashrcfile saya dan source ~/.bashrc itu. Kemudian, ketika saya melakukan `echo $ PYTHONPATH` itu memberi saya :<PATH_TO_TF>/TensorFlow/models/research/object_detection, Adakah saran jika saya telah melakukan sesuatu yang salah?
Anu
export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection, ketika Anda mengekspor PYTHONPATH untuk pertama kalinya Anda harus melakukannya tanpa ${PYTHONPATH}:bagian
boyangeor
Terima kasih, tetapi setiap kali saya me-reboot komputer saya jalur python mendapatkan reset ke yang saya atur yaitu 1 :<PATH_TO_TF>/TensorFlow/models/research/object_detectiondan menghapus ke-2 export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim. ada saran tentang itu, bagaimana cara memperbaikinya?
Anu
7

Di MacOS, Alih-alih memberikan jalur ke perpustakaan tertentu. Memberikan path lengkap ke folder proyek root di

~/.bash_profile 

membuat hari saya, misalnya:

export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"

setelah ini lakukan:

source ~/.bash_profile
tes h
sumber
6

Hanya untuk menambahkan jawaban awesomo, Anda juga dapat menambahkan baris itu ke ~/.bash_profileatau~/.profile

janex
sumber
Tambahkan ke .bash_profilejika Anda menggunakan shell login, jika tidak gunakan.profile
smac89
3

Menambahkan jalur baru ke PYTHONPATH dilakukan secara manual dengan:

menambahkan path ke profil ~ / .bashrc Anda, di terminal dengan:

vim ~/.bashrc

rekatkan yang berikut ke profil Anda

export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"

kemudian, pastikan untuk mencari sumber profil bashrc Anda ketika Anda menjalankan kode di terminal:

source ~/.bashrc 

Semoga ini membantu.

wpmoradi
sumber
2

Saya menambahkan secara permanen di Windows Vista, Python 3.5

Sistem> Panel Kontrol> Pengaturan sistem lanjutan> Lanjutan (ketuk) Variabel Lingkungan> Variabel sistem> (jika Anda tidak melihat PYTHONPATH di kolom Variabel) (klik) Baru> Nama variabel: PYTHONPATH> Nilai variabel:

Tolong, tulis direktori dalam nilai Variabel. Ini adalah detail dari jawaban Blue Peppers.

Cloud Cho
sumber
1

Script di bawah ini berfungsi pada semua platform karena ini adalah Python murni. Itu memanfaatkan PathLib path, didokumentasikan di sini https://docs.python.org/3/library/pathlib.html , untuk membuatnya bekerja lintas platform. Anda menjalankannya sekali, restart kernel dan hanya itu. Terinspirasi oleh https://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574 .

from pathlib import Path
to_add=Path(path_of_directory_to_add)
from sys import path

if str(to_add) not in path:
    minLen=999999
    for index,directory in enumerate(path):
        if 'site-packages' in directory and len(directory)<=minLen:
            minLen=len(directory)
            stpi=index

    pathSitePckgs=Path(path[stpi])
    with open(str(pathSitePckgs/'current_machine_paths.pth'),'w') as pth_file:
        pth_file.write(str(to_add))
andrei deusteanu
sumber
1

Ini adalah pembaruan untuk utas ini yang memiliki beberapa jawaban lama.

Bagi mereka yang menggunakan MAC-OS Catalina atau yang lebih baru (> = 10.15), diperkenalkan Terminal baru bernama zsh(pengganti yang lama bash).

Saya punya beberapa masalah dengan jawaban di atas karena perubahan ini, dan saya agak melakukan solusi dengan membuat file ~/.zshrcdan menempelkan direktori file ke $PATHdan$PYTHONPATH

Jadi, pertama saya lakukan:

nano ~/.zshrc

Ketika editor dibuka, saya menempelkan konten berikut:

export PATH="${PATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
export PYTHONPATH="${PYTHONPATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"

menyimpannya, dan me-restart terminal.

PENTING: Jalur di atas diatur ke jalur komputer saya, Anda harus menyesuaikannya dengan python Anda.

Caio Oliveira
sumber
0

Dalam Python 3.6.4 Anda dapat bertahan sys.path di sesi python seperti ini:

import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print(f"current working dir: {dir_path}")

root_dir = dir_path.replace("/util", '', 1)
print(f"root dir: {root_dir}")

sys.path.insert(0, root_dir)

print(str(sys.path))

Saya sangat menyarankan Anda menggunakan virtualenv dan virtualenvwrapper kalau tidak Anda akan mengacaukan jalan Anda

Bebek karet
sumber
-3

Jalur terpendek antara A <-> B adalah garis lurus;

import sys
if not 'NEW_PATH' in sys.path:
  sys.path += ['NEW_PATH']
Al Kari
sumber