การดำเนินการรหัส Python ด้วยตัวเลือก -m หรือไม่
ใช้-m
ธง
ผลลัพธ์จะเหมือนกันมากเมื่อคุณมีสคริปต์ แต่เมื่อคุณพัฒนาแพ็คเกจโดยไม่มี-m
แฟล็กจะไม่มีวิธีใดที่จะทำให้การนำเข้าทำงานได้อย่างถูกต้องหากคุณต้องการเรียกใช้แพ็กเกจย่อยหรือโมดูลในแพ็กเกจเป็นรายการหลัก ชี้ไปที่โปรแกรมของคุณ (และเชื่อฉันฉันได้ลองแล้ว)
เอกสาร
เช่นเดียวกับเอกสารบนแฟล็ก -mพูดว่า:
ค้นหา sys.path สำหรับโมดูลที่ระบุชื่อและเรียกใช้งานเนื้อหาเป็น__main__
โมดูล
และ
เช่นเดียวกับอ็อพชัน -c ไดเร็กทอรีปัจจุบันจะถูกเพิ่มไปที่จุดเริ่มต้นของ sys.path
ดังนั้น
python -m pdb
เทียบเท่ากับ
python /usr/lib/python3.5/pdb.py
(สมมติว่าคุณไม่มีแพ็คเกจหรือสคริปต์ในไดเร็กทอรีปัจจุบันของคุณที่เรียกว่า pdb.py)
คำอธิบาย:
พฤติกรรมถูกสร้างขึ้น "โดยเจตนาคล้ายกับ" สคริปต์
โมดูลไลบรารีมาตรฐานจำนวนมากมีโค้ดที่เรียกใช้ในการดำเนินการเป็นสคริปต์ ตัวอย่างคือโมดูล timeit:
โค้ด python บางตัวมีจุดประสงค์ให้รันเป็นโมดูล: (ฉันคิดว่าตัวอย่างนี้ดีกว่าตัวอย่าง doc option commandline)
$ python -m timeit '"-".join(str(n) for n in range(100))'
10000 loops, best of 3: 40.3 usec per loop
$ python -m timeit '"-".join([str(n) for n in range(100)])'
10000 loops, best of 3: 33.4 usec per loop
$ python -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 3: 25.2 usec per loop
และจากไฮไลต์บันทึกประจำรุ่นสำหรับ Python 2.4 :
อ็อพชันบรรทัดคำสั่ง -m - python -m modulename จะค้นหาโมดูลในไลบรารีมาตรฐานและเรียกใช้ ตัวอย่างเช่นpython -m pdb
เทียบเท่ากับpython /usr/lib/python2.4/pdb.py
คำถามติดตามผล
นอกจากนี้ Python Essential Reference ของ David Beazley ยังอธิบายว่า "ตัวเลือก -m รันโมดูลไลบรารีเป็นสคริปต์ที่ดำเนินการภายใน__main__
โมดูลก่อนที่จะเรียกใช้สคริปต์หลัก"
มันหมายความว่าโมดูลใด ๆ ที่คุณสามารถค้นหาด้วยคำสั่งนำเข้าสามารถใช้เป็นจุดเริ่มต้นของโปรแกรม - if __name__ == '__main__':
ถ้ามันมีการป้องกันรหัสมักจะใกล้ถึงจุดสิ้นสุดด้วย
-m
โดยไม่ต้องเพิ่มไดเร็กทอรีปัจจุบันลงในพา ธ :
ความคิดเห็นที่นี่ที่อื่นกล่าวว่า:
ตัวเลือก -m ยังเพิ่มไดเร็กทอรีปัจจุบันไปยัง sys.path ซึ่งเห็นได้ชัดว่าเป็นปัญหาด้านความปลอดภัย (ดู: การโจมตีแบบโหลดล่วงหน้า) ลักษณะการทำงานนี้คล้ายกับลำดับการค้นหาไลบรารีใน Windows (ก่อนที่จะมีการแข็งตัวเมื่อเร็ว ๆ นี้) เป็นที่น่าเสียดายที่ Python ไม่เป็นไปตามเทรนด์และไม่มีวิธีง่ายๆในการปิดการเพิ่ม ไปที่ sys.path
นี่แสดงให้เห็นถึงปัญหาที่เป็นไปได้ - (ใน windows ลบเครื่องหมายคำพูด):
echo "import sys; print(sys.version)" > pdb.py
python -m pdb
3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]
ใช้-I
แฟล็กเพื่อล็อกสิ่งนี้สำหรับสภาพแวดล้อมการใช้งานจริง (ใหม่ในเวอร์ชัน 3.4):
python -Im pdb
usage: pdb.py [-c command] ... pyfile [arg] ...
etc...
จากเอกสาร :
-I
เรียกใช้ Python ในโหมดแยก นี่ยังหมายถึง -E และ -s ในโหมดแยก sys.path ไม่มีทั้งไดเร็กทอรีของสคริปต์หรือไดเร็กทอรีไซต์แพ็กเกจของผู้ใช้ ตัวแปรสภาพแวดล้อม PYTHON * ทั้งหมดจะถูกละเว้นด้วย อาจมีการกำหนดข้อ จำกัด เพิ่มเติมเพื่อป้องกันไม่ให้ผู้ใช้ฉีดโค้ดที่เป็นอันตราย
อะไร__package__
ทำอย่างไร
มันเปิดใช้งานการนำเข้าแบบสัมพัทธ์อย่างชัดเจนโดยเฉพาะอย่างยิ่งสำหรับคำถามนี้ - ดูคำตอบนี้ที่นี่: แอตทริบิวต์ "__package__" ใน Python มีจุดประสงค์อะไร
PYTHONPATH=test python -m foo.bar
หมายถึงอะไร? กรุณาอธิบายรายละเอียดได้ไหม