ตัวเลือก -m ของบรรทัดคำสั่งค้นหาโมดูลที่กำหนดและรันมันเป็นโมดูล __main__ กลไกนี้ได้รับการสนับสนุนภายในโดยโมดูล runpy จากโมดูลมาตรฐานของ Python ที่อนุญาตให้ค้นหาสคริปต์โดยใช้นามสเปซโมดูล Python แทนระบบไฟล์
โมดูลนี้กำหนดสองฟังก์ชัน:
run_module()
ฟังก์ชันนี้รันโค้ดของโมดูลที่ระบุและคืนค่าดิกชันนารี globals ที่ได้
อาร์กิวเมนต์ mod_name ควรเป็นชื่อโมดูลแบบสัมบูรณ์ หากชื่อโมดูลอ้างถึงแพ็กเกจแทนโมดูลทั่วไป แพ็กเกจนั้นจะถูกนำเข้า และโมดูลย่อย __main__ ภายในแพ็กเกจนั้นจะถูกรันและคืนค่าดิกชันนารี globals ที่ได้
ตัวแปร глобอลพิเศษ __name__, __spec__, __file__, __cached__, __loader__ และ __package__ ถูกตั้งค่าในดิกชันนารี globals ก่อนที่โค้ดโมดูลจะถูกรัน
__name__ ถูกตั้งค่าเป็น mod_name + '.__main__' หากโมดูลที่ระบุเป็นแพ็กเกจ และเป็นอาร์กิวเมนต์ mod_name ในกรณีอื่น
__file__, __cached__, __loader__ และ __package__ ถูกตั้งค่าตามปกติโดยอิงจากโมดูลสเปก
run_path()
ฟังก์ชันนี้รันโค้ดในไฟล์ที่เส้นทางที่กำหนดและคืนค่าดิกชันนารี globals ที่ได้ เส้นทางที่ให้มาอาจอ้างถึงไฟล์ซอร์ส Python, ไฟล์ไบต์โค้ดที่คอมไพล์แล้ว, หรือรายการ sys.path ที่ถูกต้องซึ่งมีโมดูล __main__ (เช่น ไฟล์ zip ที่มีไฟล์ __main__.py ระดับบนสุด)
ตัวแปร глобอลพิเศษ __name__, __spec__, __file__, __cached__, __loader__ และ __package__ ถูกตั้งค่าในดิกชันนารี globals ก่อนที่โค้ดโมดูลจะถูกรัน
__name__ ถูกตั้งค่าเป็น run_name หากอาร์กิวเมนต์ตัวเลือกนี้ไม่ใช่ None และเป็น '
ตัวอย่าง
บันทึกสคริปต์ต่อไปนี้เป็น runpyeample.py
# runpy example
def add(x, y):
return x + y
def main():
x, y = 10, 20
print(add(x, y))
return
if __name__ == '__main__':
main()
กระบวนการทั่วไปในการรันตัวอย่างข้างต้นคือ:
>> import runpyexample as rp >>> rp.main() 30 >>>
อย่างไรก็ตาม ตอนนี้เราใช้โมดูล runpy เพื่อรันมันโดยไม่ต้องนำเข้าจริง:
>> import runpy
>>> runpy.run_module('runpyexample', run_name='__main__')
30
สามารถใช้ฟังก์ชัน run_path() ได้เช่นกัน:
>> runpy.run_path('runpyexample.py', run_name='__main__')
30
ตามที่กล่าวไว้ก่อนหน้า runpy รองรับสวิตช์ -m ของบรรทัดคำสั่ง Python:
E:\python37>python -m runpyexample 30