ฉันจะใช้สคริปต์ Python ในบรรทัดคำสั่งโดยไม่มี cd-ing ไปยังไดเรกทอรีได้อย่างไร มันเป็น PYTHONPATH หรือไม่


157

ฉันจะใช้ PYTHONPATH ได้อย่างไร เมื่อฉันพยายามเรียกใช้สคริปต์ในเส้นทางไม่พบไฟล์ เมื่อฉัน cd ไปยังไดเรกทอรีที่ถือสคริปต์สคริปต์จะทำงาน 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'

หลังจาก cd ไปที่ไดเรคทอรีของไฟล์จะทำงาน ..

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

ทำไมฉันไม่สามารถใช้ PYTHONPATH ได้?


1
เราสามารถเปลี่ยนชื่อของโพสต์นี้ได้ไหม PYTHONPATHมันไม่ได้เป็นจริงขอคำอธิบายของ
Nico Cernek

แก้ไขชื่อเพราะนี่คือสิ่งแรกที่แสดงขึ้นเมื่อ googlingPYTHONPATH
ราฟาเอล

คำตอบ:


194

ฉันคิดว่าคุณสับสนเล็กน้อย PYTHONPATH กำหนดเส้นทางการค้นหาสำหรับการนำเข้าโมดูลหลามไม่ใช่เพื่อดำเนินการตามที่คุณต้องการ

PYTHONPATH เพิ่มพา ธ การค้นหาเริ่มต้นสำหรับไฟล์โมดูล รูปแบบเหมือนกับ PATH ของเชลล์: ชื่อพา ธ ของไดเร็กทอรีตั้งแต่หนึ่งชื่อขึ้นไปคั่นด้วย os.pathsep (เช่น colons บน Unix หรือ semicolons บน Windows) ไดเรกทอรีที่ไม่มีอยู่จะถูกละเว้นอย่างเงียบ ๆ

นอกเหนือจากไดเรกทอรีปกติรายการ PYTHONPATH แต่ละรายการอาจอ้างถึง zipfiles ที่มีโมดูล Python แท้ (ในรูปแบบซอร์สหรือคอมไพล์) โมดูลส่วนขยายไม่สามารถนำเข้าจาก zipfiles

พา ธ การค้นหาเริ่มต้นนั้นขึ้นอยู่กับการติดตั้ง แต่โดยทั่วไปแล้วจะเริ่มต้นด้วยคำนำหน้า / lib / pythonversion (ดู PYTHONHOME ด้านบน) มันถูกผนวกเข้ากับ PYTHONPATH เสมอ

ไดเร็กทอรีเพิ่มเติมจะถูกแทรกในพา ธ การค้นหาด้านหน้า PYTHONPATH ตามที่อธิบายไว้ข้างต้นภายใต้ตัวเลือกอินเตอร์เฟส เส้นทางการค้นหาสามารถจัดการได้จากภายในโปรแกรม Python เป็นตัวแปร sys.path

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

สิ่งที่คุณกำลังมองหาคือ PATH

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

อย่างไรก็ตามในการรันสคริปต์ python ของคุณเป็นโปรแกรมคุณต้องตั้งshebangสำหรับ Python ในบรรทัดแรก สิ่งนี้ควรใช้งานได้:

#!/usr/bin/env python

และให้สิทธิ์ดำเนินการกับมัน:

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

จากนั้นคุณควรจะสามารถเรียกใช้gmbx.pyจากที่ใดก็ได้


2
ขอบคุณเพื่อน. ฉันยังคงรีดผ้าออก สคริปต์ของฉันประสบความสำเร็จในการนำเข้าโมดูลของฉันจาก PYTHONPATH ที่กำหนดเองของฉัน และตอนนี้ฉันเข้าใจความแตกต่าง: มันคือทั้งหมดที่เกี่ยวกับสคริปต์กับโมดูล; เรียกคำสั่งสคริปต์กับการนำเข้าหลาม ใช่ฉันจะใช้จริง ๆ แล้วexport PATH=$PATH:/home/etc
Randy Skretka

57

คุณกำลังสับสนกับ PATH และ PYTHONPATH คุณต้องทำสิ่งนี้:

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

PYTHONPATH ถูกใช้โดยตัวแปล python เพื่อกำหนดโมดูลที่จะโหลด

PATH ถูกใช้โดยเชลล์เพื่อพิจารณาว่า executables ใดที่จะรัน


38

PYTHONPATHส่งผลกระทบต่อimportข้อความสั่งเท่านั้นไม่ใช่การค้นหาไฟล์ Python ของล่ามระดับบนสุดที่กำหนดเป็นอาร์กิวเมนต์

จำเป็นต้องPYTHONPATHตั้งค่าไม่ใช่ความคิดที่ดี - เช่นเดียวกับสิ่งที่ขึ้นอยู่กับตัวแปรสภาพแวดล้อมการจำลองสิ่งต่าง ๆ อย่างสม่ำเสมอในเครื่องต่าง ๆ จะยุ่งยาก ดีกว่าคือการใช้ 'แพ็คเกจ' ของ Python ซึ่งสามารถติดตั้งได้ (โดยใช้ 'pip' หรือ distutils) ในพา ธ ที่ขึ้นกับระบบซึ่ง Python รู้อยู่แล้ว

มีการอ่านhttps://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - 'คู่มือของ Hitchhiker to Packaging' และยังhttp://docs.python.org/3/tutorial /modules.html - ซึ่งจะอธิบาย PYTHONPATH และแพ็คเกจในระดับที่ต่ำกว่า


จุดที่ถ่าย ในกรณีนี้การเพิ่มไปยัง PYTHONPATH ดูเหมือนว่าจะทำงานได้ดี ในฐานะผู้ใช้หนึ่งรายในเครื่องเดียวฉันสามารถใช้และนำรหัส. py ที่เขียนแล้วไปใช้ใหม่ได้
Randy Skretka

1
PYTHONPATHผมไม่คิดว่าการติดตั้งสิ่งที่อยู่ในระบบเส้นทางขึ้นอยู่กับการเข้าถึงรากจำเป็นต้องเป็นความคิดที่ดีกว่าการใช้ ฉันไม่นับจำนวนครั้งที่ฉันต้องจัดการกับโปรแกรม Python พื้นฐานที่ยืนยันในpip installสิ่งที่ฉันเป็นผู้ใช้ปกติบนโฮสต์ไม่เพียง แต่ไม่มีการเข้าถึงรูท (ฉันรู้ว่า pip สามารถทำการติดตั้งในเครื่องได้) ยังไม่มี pip นี่คือคำแนะนำสำหรับทุกคนที่แจกจ่ายซอฟต์แวร์ Python - ลองติดตั้งซอฟต์แวร์ของคุณเองบนโฮสต์วานิลลาลินุกซ์ที่คุณไม่มีสิทธิ์เข้าถึงรูทและมีเพียงการแจกจ่าย Python หลักเท่านั้น
amn

3

ฉันคิดว่าคุณสับสนระหว่าง PATH และ PYTHONPATH สิ่งที่คุณต้องทำเพื่อเรียกใช้ 'สคริปต์' คือมีไดเรกทอรีของผู้ปกครองผนวกเข้ากับตัวแปร PATH ของคุณ คุณสามารถทดสอบสิ่งนี้ได้ด้วยการวิ่ง

which myscript.py

นอกจากนี้หากmyscripy.pyขึ้นอยู่กับโมดูลที่กำหนดเองไดเรกทอรีผู้ปกครองของพวกเขาจะต้องเพิ่มไปยังตัวแปร PYTHONPATH น่าเสียดายที่เนื่องจากนักออกแบบของงูเหลือมมีความชัดเจนเกี่ยวกับยาเสพติดการทดสอบการนำเข้าของคุณในแบบจำลองด้วยสิ่งต่อไปนี้จะไม่รับประกันว่า PYTHONPATH ของคุณจะถูกตั้งค่าอย่างถูกต้องเพื่อใช้ในสคริปต์ ส่วนหนึ่งของการเขียนโปรแกรมหลามนี้เป็นเวทย์มนตร์และไม่สามารถตอบได้อย่างเหมาะสมในสแต็คโอเวอร์โฟลว์

$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

ด้วย PYTHONPATH ที่ตั้งค่าไว้ในตัวอย่างของคุณคุณควรจะสามารถทำได้

python -m gmbx

-mตัวเลือกจะทำให้ Python ค้นหาโมดูลของคุณในพา ธ Python มักจะค้นหาโมดูลรวมถึงสิ่งที่คุณเพิ่มไปยัง PYTHONPATH เมื่อคุณเรียกใช้ตัวแปลภาษาpython gmbx.pyดูเหมือนว่าจะหาไฟล์ใดไฟล์หนึ่งโดยเฉพาะและ PYTHONPATH จะไม่สามารถใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.