อัปเดต 2018-11-28:
นี่คือบทสรุปของการทดสอบกับ Python 2 และ 3 ด้วย
main.py - วิ่ง foo.py
foo.py - วิ่ง lib / bar.py
lib / bar.py - พิมพ์นิพจน์พา ธ ไฟล์
| Python | Run statement | Filepath expression |
|--------+---------------------+----------------------------------------|
| 2 | execfile | os.path.abspath(inspect.stack()[0][1]) |
| 2 | from lib import bar | __file__ |
| 3 | exec | (wasn't able to obtain it) |
| 3 | import lib.bar | __file__ |
สำหรับ Python 2 อาจจะชัดเจนกว่าที่จะเปลี่ยนเป็นแพ็กเกจเพื่อให้สามารถใช้งานได้from lib import bar
- เพียงเพิ่ม__init__.py
ไฟล์เปล่าลงในสองโฟลเดอร์
สำหรับ Python 3 execfile
ไม่มีอยู่ - ทางเลือกที่ใกล้ที่สุดคือexec(open(<filename>).read())
แม้ว่าจะมีผลกับกรอบสแต็ก มันง่ายที่สุดในการใช้import foo
และimport lib.bar
- ไม่__init__.py
จำเป็นต้องใช้ไฟล์
ดูเพิ่มเติมความแตกต่างระหว่างการนำเข้าและ execfile
คำตอบเดิม:
นี่คือการทดลองตามคำตอบในหัวข้อนี้ - ด้วย Python 2.7.10 บน Windows
กองซ้อนที่ใช้เป็นเพียงกลุ่มเดียวที่ดูเหมือนจะให้ผลลัพธ์ที่เชื่อถือได้ สองคนสุดท้ายมีไวยากรณ์ที่สั้นที่สุดคือ -
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
นี่คือการเพิ่มเหล่านี้ไปยังsysเป็นฟังก์ชั่น! เครดิตให้กับ @Usagi และ @pablog
อ้างอิงจากไฟล์สามไฟล์ต่อไปนี้และเรียกใช้ main.py จากโฟลเดอร์ด้วยpython main.py
(ลองใช้ไฟล์ exec กับเส้นทางแบบสัมบูรณ์และการโทรจากโฟลเดอร์อื่น)
C: \ filepaths \ main.py: execfile('foo.py')
C: \ filepaths \ foo.py: execfile('lib/bar.py')
C: \ filepaths \ lib \ bar.py:
import sys
import os
import inspect
print "Python " + sys.version
print
print __file__ # main.py
print sys.argv[0] # main.py
print inspect.stack()[0][1] # lib/bar.py
print sys.path[0] # C:\filepaths
print
print os.path.realpath(__file__) # C:\filepaths\main.py
print os.path.abspath(__file__) # C:\filepaths\main.py
print os.path.basename(__file__) # main.py
print os.path.basename(os.path.realpath(sys.argv[0])) # main.py
print
print sys.path[0] # C:\filepaths
print os.path.abspath(os.path.split(sys.argv[0])[0]) # C:\filepaths
print os.path.dirname(os.path.abspath(__file__)) # C:\filepaths
print os.path.dirname(os.path.realpath(sys.argv[0])) # C:\filepaths
print os.path.dirname(__file__) # (empty string)
print
print inspect.getfile(inspect.currentframe()) # lib/bar.py
print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\filepaths\lib
print
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
print
__file__
สัมบูรณ์หรือสัมพัทธ์