ฉันจะลองแก้ไขรูปแบบต่าง ๆ ของคำถามนี้ด้วย:
- ค้นหาเส้นทางของสคริปต์ที่เรียกว่า
- การค้นหาเส้นทางของสคริปต์ที่กำลังดำเนินการอยู่
- ค้นหาไดเรกทอรีของสคริปต์ที่เรียกว่า
(คำถามเหล่านี้บางคำถามถูกถามใน SO แต่ถูกปิดเพราะซ้ำซ้อนและเปลี่ยนเส้นทางที่นี่)
การใช้งาน __file__
สำหรับโมดูลที่คุณนำเข้า:
import something
something.__file__
จะคืนค่าพา ธสัมบูรณ์ของโมดูล อย่างไรก็ตามให้สคริปต์ foo.py:
#foo.py
print '__file__', __file__
โทรหาด้วย 'python foo.py' จะกลับมาง่ายๆ 'foo.py' หากคุณเพิ่ม shebang:
#!/usr/bin/python
#foo.py
print '__file__', __file__
และเรียกมันโดยใช้. /foo.py มันจะกลับมา './foo.py' เรียกจากไดเรกทอรีอื่น (เช่นวาง foo.py ในแถบไดเรกทอรี) จากนั้นเรียกทั้งคู่
python bar/foo.py
หรือเพิ่ม Shebang และเรียกใช้ไฟล์โดยตรง:
bar/foo.py
จะส่งคืน 'bar / foo.py' ( เส้นทางสัมพัทธ์ )
ค้นหาไดเรกทอรี
ตอนนี้ไปจากที่นั่นเพื่อรับไดเรกทอรีos.path.dirname(__file__)
ยังสามารถหากิน อย่างน้อยในระบบของฉันมันจะคืนค่าสตริงว่างถ้าคุณเรียกมันจากไดเรกทอรีเดียวกับไฟล์ อดีต
# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)
จะส่งออก:
__file__ is: foo.py
os.path.dirname(__file__) is:
กล่าวอีกนัยหนึ่งมันจะส่งคืนสตริงว่างดังนั้นจึงไม่น่าเชื่อถือหากคุณต้องการใช้สำหรับไฟล์ปัจจุบัน(ตรงข้ามกับไฟล์ของโมดูลที่นำเข้า) ในการหลีกเลี่ยงปัญหานี้คุณสามารถปิดมันด้วยการโทรหาผู้ที่ไม่เห็นด้วย:
# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))
ซึ่งแสดงผลเช่น:
os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar
โปรดทราบว่า abspath () ไม่สามารถแก้ไขลิงก์ได้ หากคุณต้องการทำสิ่งนี้ให้ใช้ realpath () แทน ตัวอย่างเช่นการสร้าง symlink file_import_testing_link ให้ชี้ไปที่ file_import_testing.py โดยมีเนื้อหาดังต่อไปนี้:
import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)
การดำเนินการจะพิมพ์เส้นทางที่แน่นอนเช่น:
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_testing_link -> file_import_testing.py
ใช้ตรวจสอบ
@SummerBreeze กล่าวถึงโดยใช้โมดูลตรวจสอบ
ดูเหมือนว่าจะทำงานได้ดีและค่อนข้างสั้นสำหรับโมดูลที่นำเข้า:
import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)
เชื่อฟังส่งคืนพา ธ สัมบูรณ์ อย่างไรก็ตามสำหรับการค้นหาเส้นทางของสคริปต์ที่กำลังดำเนินการอยู่ฉันไม่เห็นวิธีใช้งาน