Bagaimana saya bisa menggunakan skrip Python di baris perintah tanpa cd-ing ke direktori? Apakah ini PYTHONPATH?


157

Bagaimana saya dapat menggunakan PYTHONPATH? Ketika saya mencoba menjalankan skrip di path file tidak ditemukan. Ketika saya cd ke direktori memegang skrip menjalankan skrip. Jadi apa gunanya PYTHONPATH?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

Setelah cd ke direktori file itu berjalan ..

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

Mengapa saya tidak dapat menggunakan PYTHONPATH?


1
Bisakah kita mengubah judul posting ini? Sebenarnya tidak meminta penjelasan PYTHONPATH.
Nico Cernek

Judul yang diedit karena ini adalah hal pertama yang muncul ketika googlingPYTHONPATH
raphael

Jawaban:


194

Saya pikir Anda agak bingung. PYTHONPATH menetapkan jalur pencarian untuk mengimpor modul python, bukan untuk mengeksekusinya seperti yang Anda coba.

PYTHONPATH Menambah jalur pencarian default untuk file modul. Formatnya sama dengan PATH shell: satu atau lebih nama path direktori dipisahkan oleh os.pathsep (mis. Titik dua pada Unix atau titik koma pada Windows). Direktori yang tidak ada diabaikan secara diam-diam.

Selain direktori normal, entri PYTHONPATH individu dapat merujuk ke file zip yang mengandung modul Python murni (baik dalam bentuk sumber atau dikompilasi). Modul ekstensi tidak dapat diimpor dari zipfile.

Jalur pencarian default bergantung pada instalasi, tetapi umumnya dimulai dengan awalan / lib / pythonversion (lihat PYTHONHOME di atas). Itu selalu ditambahkan ke PYTHONPATH.

Direktori tambahan akan dimasukkan dalam jalur pencarian di depan PYTHONPATH seperti yang dijelaskan di atas dalam opsi Antarmuka. Jalur pencarian dapat dimanipulasi dari dalam program Python sebagai variabel sys.path.

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

Yang Anda cari adalah PATH.

export PATH=$PATH:/home/randy/lib/python 

Namun, untuk menjalankan skrip python sebagai program, Anda juga perlu mengatur shebang untuk Python di baris pertama. Sesuatu seperti ini seharusnya bekerja:

#!/usr/bin/env python

Dan berikan hak eksekusi untuk itu:

chmod +x /home/randy/lib/python/gbmx.py

Maka Anda harus bisa lari gmbx.pydari mana saja.


2
Terima kasih teman. Saya masih menyetrika ini. Script saya berhasil mengimpor modul saya dari PYTHONPATH khusus saya. Dan sekarang saya mengerti perbedaannya: itu semua tentang skrip vs modul; perintah skrip panggilan vs. impor python. Ya, saya sebenarnya akan menggunakanexport PATH=$PATH:/home/etc
Randy Skretka

57

Anda membingungkan PATH dan PYTHONPATH. Anda perlu melakukan ini:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATH digunakan oleh interpreter python untuk menentukan modul mana yang akan dimuat.

PATH digunakan oleh shell untuk menentukan executable mana yang akan dijalankan.


38

PYTHONPATHhanya memengaruhi importpernyataan, bukan pencarian juru bahasa Python tingkat atas yang diberikan sebagai argumen.

Perlu PYTHONPATHdiatur bukan ide yang bagus - karena dengan apa pun yang bergantung pada variabel lingkungan, mereplikasi hal-hal secara konsisten di berbagai mesin menjadi rumit. Lebih baik menggunakan Python 'paket' yang dapat diinstal (menggunakan 'pip', atau distutils) di jalur yang bergantung pada sistem yang sudah diketahui Python.

Baca https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - 'Panduan Hitchhiker untuk Pengemasan', dan juga http://docs.python.org/3/tutorial /modules.html - yang menjelaskan PYTHONPATH dan paket di tingkat yang lebih rendah.


Poin yang diambil. Dalam kasus khusus ini menambah PYTHONPATH tampaknya bekerja dengan baik. Sebagai satu pengguna pada satu mesin saya dapat menggunakan dan menggunakan kembali beberapa kode .py yang sudah ditulis.
Randy Skretka

1
Sejujurnya saya tidak berpikir menginstal hal-hal di jalur bergantung sistem, dengan akses root diperlukan, adalah ide yang lebih baik daripada menggunakan PYTHONPATH. Saya tidak menghitung lagi berapa kali saya harus berurusan dengan program Python yang belum sempurna yang menekankan pada pip installhal di mana saya adalah pengguna biasa pada host tidak hanya tanpa akses root (saya tahu pip dapat melakukan instalasi lokal) tetapi juga tanpa pip. Berikut ini adalah saran untuk semua orang yang mendistribusikan perangkat lunak Python - cobalah untuk menginstal perangkat lunak Anda sendiri pada host vanilla Linux di mana Anda tidak memiliki akses root dan hanya distribusi inti Python tanpa pip, pertama.
amn

3

Saya pikir Anda bingung antara PATH dan PYTHONPATH. Yang harus Anda lakukan untuk menjalankan 'skrip' adalah memilikinya direktori orangtua ditambahkan ke variabel PATH Anda. Anda dapat menguji ini dengan menjalankan

which myscript.py

Juga, jika myscripy.pytergantung pada modul khusus, direktori orang tua mereka juga harus ditambahkan ke variabel PYTHONPATH. Sayangnya, karena perancang python jelas menggunakan narkoba, menguji impor Anda di balasan dengan yang berikut ini tidak akan menjamin bahwa PYTHONPATH Anda diatur dengan benar untuk digunakan dalam skrip. Bagian dari pemrograman python ini ajaib dan tidak dapat dijawab dengan tepat di stackoverflow.

$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule

3

Dengan PYTHONPATH ditetapkan seperti dalam contoh Anda, Anda seharusnya dapat melakukannya

python -m gmbx

-mOpsi akan membuat pencarian Python untuk modul Anda di jalur. Python biasanya mencari modul, termasuk apa yang Anda tambahkan ke PYTHONPATH. Ketika Anda menjalankan penerjemah seperti python gmbx.py, itu mencari file tertentu dan PYTHONPATH tidak berlaku.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.