อะไรคือ__main__.py
ไฟล์สำหรับสิ่งที่จัดเรียงของรหัสที่ฉันควรจะใส่ลงในนั้นและเมื่อฉันควรจะมีหนึ่ง?
อะไรคือ__main__.py
ไฟล์สำหรับสิ่งที่จัดเรียงของรหัสที่ฉันควรจะใส่ลงในนั้นและเมื่อฉันควรจะมีหนึ่ง?
คำตอบ:
บ่อยครั้งโปรแกรม Python จะทำงานโดยการตั้งชื่อไฟล์. py บนบรรทัดคำสั่ง:
$ python my_program.py
นอกจากนี้คุณยังสามารถสร้างไดเรกทอรีหรือ zipfile __main__.py
เต็มรูปแบบของรหัสและรวมถึง จากนั้นคุณสามารถตั้งชื่อไดเรกทอรีหรือ zipfile บนบรรทัดคำสั่งและดำเนินการ__main__.py
โดยอัตโนมัติ:
$ python my_program_dir
$ python my_program.zip
# Or, if the program is accessible as a module
$ python -m my_program
คุณจะต้องตัดสินใจด้วยตัวคุณเองว่าใบสมัครของคุณจะได้รับประโยชน์จากการถูกดำเนินการเช่นนี้หรือไม่
โปรดทราบว่า__main__
โมดูลมักจะไม่ได้มาจาก__main__.py
ไฟล์ ทำได้ แต่โดยปกติจะไม่ เมื่อคุณเรียกใช้สคริปต์python my_program.py
สคริปต์จะทำงานเป็น__main__
โมดูลแทนmy_program
โมดูล สิ่งนี้เกิดขึ้นสำหรับโมดูลที่ทำงานpython -m my_module
ด้วยหรือในหลาย ๆ วิธี
หากคุณเห็นชื่อ__main__
ในข้อความแสดงข้อผิดพลาดนั่นไม่ได้แปลว่าคุณควรมองหา__main__.py
ไฟล์
python3 program_dir
__init__.py
python3 dir
วิ่ง__main__.py
แต่ไม่ใช่__init__.py
ในขณะที่python3 -m dir
ทำงานทั้งคู่
__main__.py
ซึ่งก่อให้เกิดการนำเข้า__init__.py
__main__.py
ไฟล์หรือไม่?เมื่อสร้างโมดูล Python เป็นเรื่องปกติที่จะทำให้โมดูลใช้งานบางฟังก์ชั่น (โดยปกติจะมีอยู่ในmain
ฟังก์ชั่น) เมื่อเรียกใช้เป็นจุดเริ่มต้นของโปรแกรม โดยทั่วไปจะทำด้วยสำนวนทั่วไปต่อไปนี้ซึ่งอยู่ที่ด้านล่างของไฟล์ Python ส่วนใหญ่:
if __name__ == '__main__':
# execute only if run as the entry point into the program
main()
__main__.py
คุณจะได้รับความหมายเดียวกันสำหรับแพคเกจหลามกับ นี่เป็นพรอมต์เชลล์ linux $
หากคุณไม่มี Bash (หรือ Posix shell) บน Windows เพียงแค่สร้างไฟล์เหล่านี้ที่demo/__<init/main>__.py
กับเนื้อหาในระหว่างEOF
s:
$ mkdir demo
$ cat > demo/__init__.py << EOF
print('demo/__init__.py executed')
def main():
print('main executed')
EOF
$ cat > demo/__main__.py << EOF
print('demo/__main__.py executed')
from __init__ import main
main()
EOF
(ในเชลล์ Posix / Bash คุณสามารถทำข้างต้นโดยไม่มี<< EOF
s และลงท้ายด้วยEOF
s โดยการป้อนCtrl+ D, อักขระสิ้นสุดไฟล์, ท้ายคำสั่ง cat แต่ละคำสั่ง)
และตอนนี้:
$ python demo
demo/__main__.py executed
demo/__init__.py executed
main executed
คุณสามารถได้มาจากเอกสาร เอกสารพูดว่า:
__main__
- สภาพแวดล้อมสคริปต์ระดับบนสุด
'__main__'
เป็นชื่อของขอบเขตที่ใช้รหัสระดับสูง โมดูล__name__
ถูกตั้งค่าเท่ากับ'__main__'
เมื่ออ่านจากอินพุตมาตรฐานสคริปต์หรือจากพรอมต์แบบโต้ตอบโมดูลสามารถค้นพบว่ามันกำลังทำงานอยู่ในขอบเขตหลักหรือไม่โดยการตรวจสอบของมันเอง
__name__
ซึ่งจะช่วยให้สำนวนสามัญสำหรับการดำเนินการตามเงื่อนไขรหัสในโมดูลเมื่อมันทำงานเป็นสคริปต์หรือด้วยpython -m
แต่ไม่เมื่อมันถูกนำเข้า:if __name__ == '__main__': # execute only if run as a script main()
สำหรับแพ็กเกจให้ผลเช่นเดียวกันสามารถทำได้โดยการรวมทั้ง โมดูลเนื้อหาที่จะได้รับการดำเนินการเมื่อโมดูลจะทำงานด้วย
__main__.py
-m
คุณสามารถจัดทำแพ็กเกจนี้เป็นไฟล์เดียวและเรียกใช้จากบรรทัดคำสั่งเช่นนี้ - แต่โปรดทราบว่าแพ็กเกจที่บีบอัดแล้วจะไม่สามารถเรียกใช้งานแพ็กเกจย่อยหรือ submodules เป็นจุดเริ่มต้น:
$ python -m zipfile -c demo.zip demo/*
$ python demo.zip
demo/__main__.py executed
demo/__init__.py executed
main() executed
__main__.py
ใช้สำหรับโปรแกรม python ในไฟล์ zip __main__.py
ไฟล์จะถูกดำเนินการเมื่อไฟล์ซิปในการดำเนินการ ตัวอย่างเช่นหากไฟล์ zip เป็นเช่นนี้:
test.zip
__main__.py
และเนื้อหาของ__main__.py
คือ
import sys
print "hello %s" % sys.argv[1]
ถ้าเราจะวิ่งpython test.zip world
เราจะhello world
ออกไป
ดังนั้น__main__.py
ไฟล์จะทำงานเมื่อมีการเรียก python ในไฟล์ zip
คุณสร้าง__main__.py
ขึ้นyourpackage
เพื่อให้สามารถเรียกใช้งานได้เป็น:
$ python -m yourpackage
-m
ใช้งานได้หากโปรแกรมสามารถเข้าถึงได้เป็นโมดูลเท่านั้นมิฉะนั้นคุณสามารถใช้python <yourpackage>
หมายเหตุ: ไม่มี-m
ตัวเลือก
package
?
python -m <yourproject>
ไม่ทำงาน-m
เป็นตัวเลือกที่ซ้ำซ้อน แต่python <yourpackage>
ทำงานได้ดี
a
และสมมติสคริปต์a/b/c/__main__.py
... python -m b.c
จะดำเนินการจากไดเรกทอรีและการนำเข้าสคริปต์หลักจะเป็นเมื่อเทียบกับa
a
แต่python b/c
จะดำเนินการจากขอบเขตการนำเข้าของ dir c
ดังนั้นการนำเข้าใด ๆ ในสคริปต์หลักเช่นimport b.d
จะล้มเหลว
หากสคริปต์ของคุณเป็นไดเรกทอรีหรือไฟล์ ZIP แทนที่จะเป็นไฟล์ไพ ธ อนเดียวไฟล์__main__.py
จะถูกดำเนินการเมื่อ "สคริปต์" ถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังตัวแปลภาษาไพ ธ อน
python -m program_dir
และpython program_dir
แตกต่างเล็กน้อย: หลังไม่เคยทำงาน__init__.py
ในไดเรกทอรี (ถ้ามี)