ตัวแปร __file__ หมายความว่า / ทำอะไร


177
A = os.path.join(os.path.dirname(__file__), '..')

B = os.path.dirname(os.path.realpath(__file__))

C = os.path.abspath(os.path.dirname(__file__))

ฉันมักจะ hardwire เหล่านี้กับเส้นทางที่เกิดขึ้นจริง แต่มีเหตุผลสำหรับคำสั่งเหล่านี้ที่กำหนดเส้นทางที่รันไทม์และฉันอยากจะเข้าใจโมดูล os.path เพื่อให้ฉันสามารถเริ่มใช้มัน

คำตอบ:


162

เมื่อโมดูลถูกโหลดจากไฟล์ใน Python __file__จะถูกตั้งค่าเป็นพา ธ จากนั้นคุณสามารถใช้สิ่งนั้นกับฟังก์ชั่นอื่น ๆ เพื่อค้นหาไดเรกทอรีที่ไฟล์นั้นอยู่

ยกตัวอย่างของคุณทีละครั้ง:

A = os.path.join(os.path.dirname(__file__), '..')
# A is the parent directory of the directory where program resides.

B = os.path.dirname(os.path.realpath(__file__))
# B is the canonicalised (?) directory where the program resides.

C = os.path.abspath(os.path.dirname(__file__))
# C is the absolute path of the directory where the program resides.

คุณสามารถดูค่าต่าง ๆ ที่ส่งคืนจากสิ่งเหล่านี้ได้ที่นี่:

import os
print(__file__)
print(os.path.join(os.path.dirname(__file__), '..'))
print(os.path.dirname(os.path.realpath(__file__)))
print(os.path.abspath(os.path.dirname(__file__)))

และให้แน่ใจว่าคุณเรียกใช้งานจากสถานที่ที่แตกต่างกัน (เช่น./text.py, ~/python/text.pyและอื่น ๆ ) เพื่อดูสิ่งที่แตกต่างที่ทำให้


7
คำตอบที่ดี แต่ดูรายละเอียดอื่น ๆ ที่สำคัญจากคำตอบอื่น ๆ : __file__ไม่ได้กำหนดไว้ในทุกกรณีเช่นโมดูล C ที่เชื่อมโยงแบบคงที่ เราไม่สามารถไว้วางใจได้__file__เสมอ
Chris Johnson

5
name '__file__' is not definedในล่ามตัวอย่างทั้งหมดกลับ
user1063287

10
@ user1063287 ดูที่คำตอบของ DemoUser __file__เป็นชื่อพา ธ ของไฟล์ที่โมดูลถูกโหลดถ้ามันถูกโหลดจากไฟล์ ซึ่งหมายความว่า__file__จะใช้งานได้เมื่อคุณเรียกใช้เป็นสคริปต์ที่ไม่ได้อยู่ในล่าม (เว้นแต่คุณจะนำเข้าเป็นล่าม ... )
YOUNG

59

ฉันแค่ต้องการจะจัดการกับความสับสนก่อน __file__ไม่ใช่อักขระตัวแทนซึ่งเป็นแอตทริบิวต์ คุณลักษณะและวิธีการขีดเส้นใต้คู่จะถือว่าเป็น "พิเศษ" โดยการประชุมและให้บริการวัตถุประสงค์พิเศษ

http://docs.python.org/reference/datamodel.htmlแสดงวิธีและคุณลักษณะพิเศษมากมายหากไม่ใช่ทั้งหมด

ในกรณี__file__นี้เป็นคุณสมบัติของโมดูล (วัตถุโมดูล) ใน Python .pyไฟล์เป็นโมดูล ดังนั้นimport amoduleจะมีคุณลักษณะ__file__ที่หมายถึงสิ่งต่าง ๆ ภายใต้สถานการณ์ที่แตกต่างกัน

นำมาจากเอกสาร:

__file__เป็นชื่อพา ธ ของไฟล์ที่โมดูลถูกโหลดถ้ามันถูกโหลดจากไฟล์ ไม่มี__file__แอตทริบิวต์นี้สำหรับโมดูล C ที่เชื่อมโยงกับล่ามแบบคงที่ สำหรับโมดูลส่วนขยายที่โหลดแบบไดนามิกจากไลบรารีที่แชร์จะเป็นชื่อพา ธ ของไฟล์ไลบรารีที่แชร์

ในกรณีของคุณโมดูลกำลังเข้าถึงเป็น__file__คุณสมบัติของตัวเองในเนมสเปซส่วนกลาง

หากต้องการดูสิ่งนี้ในการดำเนินการลอง:

# file: test.py

print globals()
print __file__

และเรียกใช้:

python test.py

{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
 'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py

23

ตามเอกสาร :

__file__เป็นชื่อพา ธ ของไฟล์ที่โมดูลถูกโหลดถ้ามันถูกโหลดจากไฟล์ ไม่มี__file__แอตทริบิวต์นี้สำหรับโมดูล C ที่เชื่อมโยงกับล่ามแบบคงที่ สำหรับโมดูลส่วนขยายที่โหลดแบบไดนามิกจากไลบรารีที่แชร์จะเป็นชื่อพา ธ ของไฟล์ไลบรารีที่แชร์

และยัง :

__file__จะเป็น "เส้นทาง" ไปยังไฟล์ยกเว้นโมดูลที่มีอยู่แล้วภายใน (และแสดงไว้ในsys.builtin_module_names) ซึ่งในกรณีนี้ไม่มีการตั้งค่าคุณลักษณะ


13

การใช้__file__ร่วมกับos.pathโมดูลต่าง ๆทำให้เส้นทางทั้งหมดสัมพันธ์กับตำแหน่งไดเรกทอรีของโมดูลปัจจุบัน สิ่งนี้ช่วยให้โมดูล / โครงการของคุณสามารถพกพาไปยังเครื่องอื่น ๆ ได้

ในโครงการของคุณคุณทำ:

A = '/Users/myname/Projects/mydevproject/somefile.txt'

จากนั้นลองปรับใช้กับเซิร์ฟเวอร์ของคุณด้วยไดเรกทอรีการปรับใช้เช่น/home/web/mydevproject/นั้นรหัสของคุณจะไม่สามารถค้นหาเส้นทางได้อย่างถูกต้อง

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