ทำไม Python ใน Linux ต้องการ line #! / usr / bin / python


50

คำถามที่ค่อนข้างง่าย: ใน Linux ทำไม Python ต้องการบรรทัด

#!/usr/bin/python

ที่จุดเริ่มต้นของไฟล์หลามตั้งแต่ Windows ไม่?

มันทำอะไร? 'ทำให้คำอธิบาย "Links to Python" ค่อนข้างคลุมเครือ ...


28
คำตอบด้านล่างนั้นถูกต้องทั้งหมดไม่มีคำตอบใดที่อยู่ว่าทำไม Windows จึงไม่ต้องการบรรทัดนี้ Windows ขึ้นอยู่กับส่วนขยายของไฟล์ (ส่วนต่อจาก.) เพื่อพิจารณาว่าเป็นไฟล์ประเภทใด แม้แต่ Windows ก็กำลังเคลื่อนห่างจากสิ่งนี้: ตรวจสอบสองสามบรรทัดแรกของไฟล์ Microsoft Word และจะระบุว่าในความเป็นจริงแล้วคือไฟล์ Microsoft Word
ชาร์ลส์กรีน

9
ช้างในห้องคือคุณไม่ควรใช้ / usr / bin / python จนกว่าคุณจะเข้ากันได้กับ python 2 และ 3 เหตุผล: arch เชื่อมโยงไปยัง python3 ซึ่งเป็นท่าที่ PSF เป็นผู้แนะนำ
ยังมีผู้ใช้อื่น

5
มันส่อให้เห็น แต่ไม่ได้ระบุไว้อย่างชัดเจนในคำตอบด้านล่างที่มันไม่จำเป็น จำเป็นถ้าคุณต้องการรันสคริปต์จากชื่อของตัวเอง คุณสามารถเรียกใช้python myscript.pyแทน
Chris H

3
@CharlesGreen เราไม่ควรจะรู้ว่าทำไม windows ถึงไม่ ;-) นั่นขึ้นอยู่กับ SO
Rinzwind

2
@YetAnotherUser เป็นเวลาหกปีและสิบเอ็ดเดือนนับตั้งแต่ Python 3 ได้รับการปล่อยตัว ณ จุดนี้ฉันรู้สึกว่าผู้คนจะดีกว่าการผิดนัด 3 และระบุการใช้ 2 เมื่อจำเป็น
JAB

คำตอบ:


58

Pythonไม่มีข้อกำหนดพิเศษใด ๆ บน Linux เป็นตัวโหลดโปรแกรมบน Unix / Linux ที่ใช้บรรทัด "shebang" ตามที่เรียกว่า นี่คือคุณลักษณะจริง ๆ มากกว่าข้อ จำกัด แต่เราจะไปถึงในเวลาไม่นาน หน้า Wiki ใน "shebang" มีรายละเอียดเพิ่มเติมแต่ฉันจะพยายามให้ภาพรวมรวมถึงการเปรียบเทียบกับ Windows ที่นี่

อันดับแรกให้ดูที่สถานการณ์บน Windows:

  • เมื่อคุณพยายามเปิดหรือเรียกใช้ไฟล์ Windows จะตรวจสอบส่วนขยายของไฟล์ก่อน นี่คือที่ผ่านมาเป็นส่วนหนึ่งของชื่อไฟล์ที่เริ่มต้นด้วยในกรณีที่ไฟล์หลามนี้เป็นปกติ..py
  • Windows จะค้นหาสิ่งที่ต้องดำเนินการตามส่วนขยายของไฟล์
    • ข้อมูลนี้ถูกบันทึกไว้ในรีจิสทรีของ Windows เมื่อติดตั้ง Python โดยทั่วไปแล้วจะแจ้งให้ Windows ทราบว่า.pyควรเปิดไฟล์โดยใช้แอปพลิเคชั่น Python ที่เพิ่งติดตั้งใหม่(เช่นตัวแปล Python)
    • ไฟล์หลายประเภทมีพฤติกรรมในตัว ตัวอย่างเช่นไฟล์ที่ปฏิบัติการได้ (เช่นตัวแปล Python) ต้องสิ้นสุด.exeและ.batไฟล์จะถูกเรียกใช้งานเป็นสคริปต์แบตช์ของ Windows
    • การดำเนินการสำหรับไฟล์ประเภทใดประเภทหนึ่งนั้นสามารถปรับแต่งได้ คุณสามารถเช่นบอก Windows ที่แทนที่จะวิ่ง.pyไฟล์โดยใช้python.exeก็ควรเปิดให้กับโปรแกรมอื่น ๆ notepad.exeบางอย่างเช่นการแก้ไขข้อความ
      • ในกรณีนี้เพื่อเรียกใช้สคริปต์ Python คุณจะต้องโทรด้วยตนเองpython <scriptname>.py (หรือเขียน.batไฟล์เพื่อทำสิ่งนี้ให้คุณ)

ตอนนี้จะเกิดอะไรขึ้นถ้ามีบรรทัด shebang ( #!/usr/bin/pythonหรือ#!/usr/bin/env python) อยู่ด้านบนของสคริปต์ Python ทีนี้เนื่องจาก#เป็นบรรทัดความคิดเห็นใน Python ล่าม Python จะไม่สนใจมัน นี่คือเหตุผลหนึ่งว่าทำไมภาษาสคริปต์ส่วนใหญ่ที่ใช้ในโลก Unix / Linux ใช้#เพื่อเริ่มบรรทัดความคิดเห็น

ดังนั้นจึงเป็นการทำให้เข้าใจผิดเล็กน้อยที่จะบอกว่า Windows "ไม่จำเป็นต้อง" #!บรรทัด; Windows ไม่เห็น#!บรรทัดและในความเป็นจริงต้องอาศัยไฟล์นามสกุลที่จะบอกว่าสิ่งที่จะทำ นี่เป็นข้อเสียสองประการ:

  • คุณต้องตั้งชื่อสคริปต์ Python ด้วย.pyท้ายเพื่อให้รู้จักโดยอัตโนมัติ
  • ไม่มีวิธีที่ง่ายในการแยกแยะสคริปต์ Python2 จากสคริปต์ Python3
  • ตามที่ระบุไว้ก่อนหน้านี้หากคุณเปลี่ยนพฤติกรรมการเปิดตัวเริ่มต้นสำหรับ.pyประเภทไฟล์ Windows จะไม่เรียกใช้สคริปต์เหล่านั้นกับ Python อีกต่อไปโดยอัตโนมัติ โปรดทราบว่าสิ่งนี้สามารถทำได้โดยไม่ได้ตั้งใจ

ตอนนี้มาดูกันว่า Unix / Linux เปิดตัวสคริปต์:

สิ่งแรกที่ควรทราบคือ Unix / Linux ซึ่งแตกต่างจาก Windows ไม่ได้พยายาม "เปิด" สคริปต์ Python โดยใช้โปรแกรมเฉพาะอย่างน้อยแนวคิด ระบบปฏิบัติการรู้ว่าสคริปต์เป็นสิ่งที่สามารถเรียกใช้งานได้เนื่องจากสิ่งที่เรียกว่า "execute bit" (ซึ่งอยู่นอกขอบเขตของคำตอบนี้) ดังนั้นถ้าคุณตั้งใจพิมพ์#!/usr/bin/pthonแทน#!/usr/bin/pythonคุณจะได้รับข้อผิดพลาดที่มีข้อความนี้:

/usr/bin/pthon: bad interpreter: No such file or directory.

คำว่า "ล่าม" ช่วยให้เราทราบเกี่ยวกับบทบาทของบรรทัด Shebang (แม้ว่าในทางเทคนิคแล้วโปรแกรมที่ระบุอาจเป็นอย่างอื่นที่ไม่ใช่ล่ามเช่นcatหรือโปรแกรมแก้ไขข้อความ) เมื่อคุณพยายามเรียกใช้ไฟล์นี่คือสิ่งที่เกิดขึ้น:

  • ตัวโหลดโปรแกรม Unix / Linux ดูที่สองไบต์แรกของไฟล์นั้น หากทั้งสองไบต์#!นั้นโหลดเดอร์จะตีความส่วนที่เหลือของบรรทัด Shebang (ไม่รวม Shebang เอง) เป็นคำสั่งเพื่อเปิดตัวล่ามที่จะเรียกใช้เนื้อหาไฟล์เป็นสคริปต์
  • โปรแกรมโหลดเดอร์เปิดตัวล่ามที่ระบุป้อนเส้นทางของไฟล์ต้นฉบับเป็นอาร์กิวเมนต์

นี่เป็นข้อดีสองประการ:

  • ผู้เขียนสคริปต์มีการควบคุมมากขึ้นว่าจะใช้ล่าม (ซึ่งแก้ปัญหา Python2 / Python3) และบางครั้งสามารถส่งอาร์กิวเมนต์พิเศษไปที่ล่าม (ดูหน้า Wiki สำหรับรายละเอียด)
  • ชื่อไฟล์ของสคริปต์จะถูกละเว้นดังนั้นคุณสามารถตั้งชื่อสคริปต์ Python ได้ตามต้องการ

โปรดทราบว่าในที่สุด Unix / Linux ไม่ ต้องการบรรทัด shebang เพื่อเรียกใช้สคริปต์ Python โปรดจำไว้ว่าสาย shebang ทั้งหมดที่ใช้งานจริงนั้นอนุญาตให้โปรแกรมโหลดเดอร์เลือกล่าม แต่เช่นเดียวกับใน Windows สิ่งนี้สามารถทำได้ด้วยตนเอง:

python <myscript>

1
บน Windows คุณสามารถมี.py2และ.py3ส่วนขยายสำหรับสคริปต์ Python 2 / Python 3 ได้อย่างง่ายดาย ดังนั้นทั้ง Linux (+ x บิต) และ Windows (นามสกุลไฟล์) จึงจำเป็นต้องมีเมทาดาทาในระบบไฟล์ ข้อแตกต่างหลักคือ + x บิตจะหายไปในการขนส่งได้ง่ายขึ้น นี่ไม่จำเป็นต้องเป็นข้อเสีย
MSalters

1
@Malters บิตดำเนินการยังมีการเข้ารหัสข้อมูลน้อยลง และทราบว่าคุณอาจมีล่าม Python2 หลายตัวในระบบที่กำหนด (มีสถานการณ์ที่คล้ายกันกับ Ruby และภาษาอื่น ๆ ที่งานก่อนหน้าของฉัน); การจัดการกับสิ่งนี้ผ่านทางสาย shebang นั้นแทบจะเป็นเรื่องเล็กน้อยในขณะที่สถานการณ์ใน Windows จะมีความเป็นไปได้น้อยมากที่คุณพยายามจัดการไฟล์ประเภทเดียวกันหลายประเภท
Kyle Strand

ส่วนขยายจะนับเป็น "ข้อมูลเมตา" จริงหรือไม่ มันเป็นเพียงส่วนหนึ่งของชื่อไฟล์
Kyle Strand

1
ข้อมูลเมตาของไฟล์มีทั้งชื่อไฟล์เวลาการสร้างบิตการเข้าถึงเป็นต้นเฉพาะเนื้อหาเท่านั้นที่เป็นข้อมูลแทนที่จะเป็นข้อมูลเมตา สำหรับ "ล่ามหลายคน" นั้นเป็นปัญหาที่แท้จริงและแน่นอนว่าทำไมมันไม่ควรอยู่ในกลุ่ม Shebang เกิดอะไรขึ้นถ้าคุณมี/usr/bin/i686/pythonและ/usr/bin/amd64/python? ที่สมบูรณ์แบบที่เหมาะสม /usr/bin/pythonแต่จะแบ่งสคริปต์หลามที่มีสมมติฐานฮาร์ดโค้ดบน ตัวเลือกของล่ามไม่ใช่ทางเลือกของผู้เขียนสคริปต์ แต่เป็นผู้ใช้สคริปต์ผู้เขียนสคริปต์เท่านั้นที่จะเลือกภาษา (ภาษาถิ่น)
MSalters

1
@MSalters นั่นคือสิ่งที่/usr/bin/envมีไว้สำหรับพร้อมกับสคริปต์การตั้งค่า env Windows รุ่นนี้คืออะไร เรียกใช้regeditสคริปต์ทันทีก่อนที่คุณจะเปิด.pyไฟล์เพื่อให้แน่ใจว่าคุณได้รับล่ามที่คุณต้องการ?
Kyle Strand

41

บรรทัดที่คุณระบุถูกใช้เพื่อบอกคอมพิวเตอร์ว่าโปรแกรม / ล่ามจะใช้อะไรเมื่อเรียกใช้ไฟล์ / สคริปต์โดยตรงและข้อโต้แย้งใด ๆ ที่ควรส่งผ่านไปยังโปรแกรมนั้นเมื่อสคริปต์ทำงาน อย่างไรก็ตามนี่ไม่ใช่ข้อกำหนดของPythonแต่เป็นข้อกำหนดของ linux kernel / system หากคุณต้องการรันสคริปต์โดยตรง (และไม่ส่งให้ Python โดยใช้ไวยากรณ์ด้านล่าง)

มันไม่จำเป็นถ้าคุณจะรันpython script.pyหรือคล้ายกัน จำเป็นเฉพาะเมื่อคุณต้องการเรียกใช้สคริปต์ / ไฟล์โดยตรงโดยไม่ต้องให้ล่ามใช้ (เช่นpython)


สำหรับสคริปต์ Bash มันจะมีดังนี้:

#!/bin/bash [optional Bash arguments]
# Bash script code here
...
exit 0;

สิ่งนี้จะบ่งชี้ถึงระบบว่าเมื่อรันสิ่งนี้ควรรันผ่าน/bin/bashซึ่งเป็นหนึ่งในภาษา shells / shell-script บนระบบ


สำหรับรหัส Python ที่นี่คุณจะต้องการให้ไฟล์ที่เรียกใช้ทำงานได้ผ่าน Python ดังนั้นคุณจึงบอกได้เลยว่าคุณต้องการล่ามแปลภาษาอะไร

#!/usr/bin/python [optional Python arguments]
# Python code here
...
exit()

สิ่งนี้เช่นเดียวกับ Bash บ่งชี้ว่า/usr/bin/pythonควรใช้งาน (ซึ่งน่าจะเป็น Python 2 หรือ Python 3 ขึ้นอยู่กับการกำหนดค่าระบบของคุณเอง)


ด้วยวิธีนี้คุณสามารถเรียกใช้./filename.pyหรือ./executableหรือ./scripttorunโดยตรง

หากไม่มีบรรทัดนั้นที่จุดเริ่มต้นและสมมติว่าคุณได้ตั้งค่าไฟล์ / สคริปต์ให้สามารถเรียกใช้งานได้และสมมติว่าคุณทำงานกับสคริปต์ Python คุณจะต้องเรียกใช้python filename.pyหรือคล้ายกันหากคุณไม่มี#!/usr/bin/pythonบรรทัด (สำหรับสคริปต์ Bash คุณต้องทำbash script.shหรือคล้ายกับสคริปต์ / ภาษาอื่น ๆ เช่น Perl, Ruby และอื่น ๆ )

การเน้นไวยากรณ์ด้านบนเป็นเฉพาะภาษาในแต่ละส่วนแม้ว่าจะไม่สำคัญ


1
สิ่งที่น่าสนใจที่จะเพิ่มจะว่ามันเป็นไปได้ที่จะระบุพารามิเตอร์เพิ่มเติมหลังจาก shebang ตัวเองในส่วนของคดีในลักษณะเดียวกันเช่นถ้าล่ามถูกเรียกโดยตรง ( #!/bin/bash -x, #!/usr/bin/perl -lanฯลฯ )
kos

7
@kos: ฉันคิดว่าคุณสามารถระบุอาร์กิวเมนต์พิเศษหนึ่งรายการซึ่งเป็น PITA เมื่อมีการใช้งาน/usr/bin/env pythonเพื่อให้ได้ผลลัพธ์ที่ถูกต้อง
unperson325680

@progo ไม่แน่ใจว่าปัญหาenvคืออะไร แต่ปัญหาดูเหมือนจะไม่เป็นจำนวนของข้อโต้แย้ง: #!/usr/bin/perl -l -a -nมีสามข้อโต้แย้ง แต่มันทำงานได้ แม้ว่าอีกครั้งฉันจะไม่สามารถคลี่คลายปัญหาที่แน่นอนได้
kos

./เมื่อชัดเจนเรียกล่ามกับสคริปต์ที่เป็นอาร์กิวเมนต์มีเหตุผลที่จะมีการเริ่มต้นหลังไม่มี ในคำอื่น ๆ เพียงpython filename.pyหรือbash script.shจะทำงานได้ดี เหตุผลเดียวที่จะรวม./อยู่ในชื่อคำสั่งเมื่อคุณต้องการบอกเชลล์ไม่ให้ค้นหา$PATH(ซึ่งอาจจะไม่พบไฟล์ในไดเรกทอรีปัจจุบัน) แต่ใช้เส้นทางที่คุณระบุตามที่เป็น แต่นั่นไม่ได้ใช้กับคำสั่งอาร์กิวเมนต์
Marc van Leeuwen

@kos: ปัญหาอาจเกิดจากวิธีenvรับอาร์กิวเมนต์ที่เหลือจากเคอร์เนล พวกเขาทั้งหมดสามารถสันนิษฐานว่าเป็นอาร์กิวเมนต์ขนาดใหญ่หนึ่งโดยไม่มีการแยกตามพื้นที่ ขออภัยที่ประกบฉันจำรายละเอียดของสิ่งนี้ไม่ได้อีกต่อไป
unperson325680

16

เส้น:

#!/usr/bin/python

เรียกว่า 'shebang' และระบุเส้นทางไปยังตัวแปลไบนารีที่จะใช้ในการแปลคำสั่งที่เหลือในไฟล์ โดยปกติจะเป็นบรรทัดแรกของสคริปต์

ดังนั้นบรรทัด#!/usr/bin/pythonแสดงให้เห็นว่าเนื้อหาของแฟ้มจะถูกตีความโดยไบนารีตั้งอยู่ที่python/usr/bin/python

โปรดทราบว่าบรรทัด shebang จะถูกวิเคราะห์โดยเคอร์เนลจากนั้นสคริปต์จะถูกเรียกใช้เป็นอาร์กิวเมนต์ในที่สุด:

python script_name

ในทำนองเดียวกันในกรณีของ#!/bin/bash:

bash script_name

2
shebangฉันไม่คิดว่าฉันเคยเห็นในยัติภังค์ เนื่องจากคำว่ามาจาก "แฮช" และ "ปัง" การสะกดของคุณไม่ชัดเจนมากเนื่องจากดูเหมือนว่าเป็นการรวมกันของ"เธอ"และ "ปัง"
Kyle Strand

คุณสามารถเรียกมันว่าhashbang( #= "hash") หรือshebang( #= "sharp") ขึ้นอยู่กับว่าคุณตั้งชื่อ#ตัวละครอย่างไร อย่างไรก็ตามshebangเป็นเรื่องธรรมดามากขึ้น @KyleStrand
ผู้บัญชาการ Byte

7

ในทางเทคนิคแล้วมันไม่ต้องการมัน มันต้องการเส้นทางสู่สภาพแวดล้อมที่สคริปต์ของคุณดำเนินการ สคริปต์ในอนาคตของคุณน่าจะดีกว่าที่จะรวม / usr / bin / env จากนั้นระบุ python ผู้รับอนุญาตนี้สคริปต์ของคุณทำงานในสภาพแวดล้อมของหลามไม่ว่าจะติดตั้งที่ใดก็ตาม คุณต้องการทำสิ่งนี้ด้วยเหตุผลด้านความเข้ากันได้คุณไม่แน่ใจว่าบุคคลต่อไปที่คุณแชร์รหัสด้วยจะมีการติดตั้ง python ใน usr / bin / python หรือว่าพวกเขาจะมีสิทธิ์ในไฟล์ระบบเหล่านั้น

นี่คือที่คล้ายกัน Q & A จากสแตกล้น

สิ่งที่ดูเหมือนในสคริปต์ของคุณคือ:

#!/usr/bin/env python

ฉันเห็นปัญหาบางอย่างเกี่ยวกับวิธีการระบุ python3 นี่คือวิธีที่จะทำ:

#!/usr/bin/env python3

5

ใน Linux Python อาจหรืออาจไม่ต้องการ#!บรรทัด (shebang) ขึ้นอยู่กับวิธีจัดการรหัส Python ไม่ว่าจะเป็นการเรียกใช้รหัสในโหมดโต้ตอบ Python หรือสคริปต์ Python

Python mode modeอนุญาตให้ผู้ใช้พิมพ์และรัน Python codes โดยตรงซึ่งไม่จำเป็นต้องใช้สาย shebang ในการเรียกใช้โหมดโต้ตอบให้เปิดเทอร์มินัลแล้วพิมพ์pythonสำหรับ Python 2.X หรือpython3Python 3.X

$  python
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

$  python3
Python 3.4.3 (default, Oct 14 2015, 20:33:09) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

สคริปต์ Pythonอนุญาตให้ผู้ใช้เขียนและบันทึกรหัส Python ในไฟล์ข้อความธรรมดาจากนั้นเรียกใช้รหัสในภายหลัง สิ่งนี้อาจจะหรืออาจไม่จำเป็นต้องใช้สาย Shebang อย่างไรก็ตามมีเหตุผลสองประการที่ทราบว่าจำเป็นต้องใช้บรรทัด shebang สำหรับการใช้สคริปต์ Python ใน Linux

  1. เพื่อเรียกใช้โค้ด Python ในสคริปต์ที่สามารถเรียกทำงานได้เช่นกำหนดว่าควรรันโค้ดอย่างไรและใช้ล่ามอะไร

  2. การเรียกใช้รหัส Python ที่เกี่ยวข้องกับ Python รุ่นเฉพาะเช่นรหัสการทำงานที่เข้ากันได้กับ Python 2.X หรือ Python 3.X เท่านั้น

ฝึกฝนกับสคริปต์ Python

ด้านล่างนี้เป็นรายการและเนื้อหาของไฟล์ที่ฉันเคยใช้เพื่อแสดงกรณีที่#!จำเป็นต้องใช้บรรทัด (shebang) หรือไม่จำเป็น

$  ls -ln *.py
-rw-rw-r-- 1 1000 1000  94 Dec 14 18:37 hello1.py
-rwxrwxr-x 1 1000 1000 116 Dec 14 18:37 hello2e.py
-rw-rw-r-- 1 1000 1000 116 Dec 14 18:37 hello2.py
-rwxrwxr-x 1 1000 1000 117 Dec 14 18:37 hello3e.py
-rwxrwxr-x 1 1000 1000 120 Dec 14 18:37 hello3m.py
-rw-rw-r-- 1 1000 1000 117 Dec 14 18:37 hello3.py

$  file *.py
hello1.py:  ASCII text
hello2e.py: Python script, ASCII text executable
hello2.py:  Python script, ASCII text executable
hello3e.py: Python script, ASCII text executable
hello3m.py: Python script, UTF-8 Unicode (with BOM) text executable
hello3.py:  Python script, ASCII text executable
  • hello1.py มีซอร์สโค้ดเท่านั้น

    import sys
    sys.stdout.write("Hello from Python %s\n" % (sys.version,))
    print("Hello, World!")
  • hello2.py มีซอร์สโค้ดและบรรทัด shebang

    #!/usr/bin/env python
    import sys
    sys.stdout.write("Hello from Python %s\n" % (sys.version,))
    print("Hello, World!")
  • hello2e.pyมีเหมือนhello2.pyและทำให้ปฏิบัติการ

  • hello3.pyมีเช่นเดียวกับการhello2.pyยกเว้นมันจะปรับตัวให้เข้าทำงานกับงูหลาม 3 #!/usr/bin/env python3โดยการเปลี่ยนชื่อสายแรกที่จะ

  • hello3e.pyมีเหมือนhello3.pyและทำให้ปฏิบัติการ

  • hello3m.pyมีเหมือนกับhello3.pyและสร้างไฟล์สั่งการยกเว้นบันทึกด้วยWrite Unicode BOMตัวเลือกในโปรแกรมแก้ไขข้อความเช่น Mousepad

นอกเหนือจากจุดนี้ผู้ใช้จะมีสองวิธีในการเรียกใช้สคริปต์ Python ทั้งสองวิธีได้รับการสาธิตดังนี้

วิธีที่ 1: เรียกใช้ด้วยโปรแกรม Python

ด้านล่างนี้เป็นคำสั่งและเอาต์พุตเมื่อใช้งานซอร์สโค้ดด้วย Python 2 และ Python 3

$  python hello1.py
Hello from Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2]
Hello, World!

$  python3 hello1.py
Hello from Python 3.4.3 (default, Oct 14 2015, 20:33:09) 
[GCC 4.8.4]
Hello, World!

Python ทั้งสองรุ่นสามารถเรียกใช้สคริปต์ได้สำเร็จ ดังนั้นบรรทัด shebang จึงไม่จำเป็นเมื่อเรียกใช้สคริปต์ Python ผ่านทางpythonหรือpython3คำสั่ง

วิธีที่ 2: เรียกใช้เป็นสคริปต์ Python

ด้านล่างนี้เป็นคำสั่งและเอาท์พุทเมื่อเรียกใช้ซอร์สโค้ดด้วยบรรทัด shebang ซึ่งปรับให้เข้ากับทั้ง Python 2 และ Python 3 รวมถึงกรณีที่ไม่สามารถเรียกใช้งานได้และปฏิบัติการได้

$  ./hello1.py
bash: ./hello1.py: Permission denied

$  ./hello2.py
bash: ./hello2.py: Permission denied

$  ./hello3.py
bash: ./hello3.py: Permission denied

$  ./hello2e.py 
Hello from Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2]
Hello, World!

$  ./hello3e.py 
Hello from Python 3.4.3 (default, Oct 14 2015, 20:33:09) 
[GCC 4.8.4]
Hello, World!

สคริปต์สามตัวแรกล้มเหลวเนื่องจากสคริปต์เหล่านี้ไม่สามารถเรียกใช้งานได้โดยไม่คำนึงถึงบรรทัด Shebang หรือไม่ (สำหรับหลักฐานสนับสนุนดูตัวอย่างเพิ่มเติมด้านล่าง) สคริปต์สองสคริปต์สุดท้ายมีบรรทัด shebang และสามารถเรียกใช้งานได้

เห็นได้ชัดว่าสคริปต์ที่ถูกทำให้สามารถเรียกใช้งานได้นั้นไม่มีประโยชน์หากไม่มีบรรทัด shebang ดังนั้นจึงจำเป็นต้องมีบรรทัด shebang และสคริปต์จะต้องสามารถเรียกใช้งานได้เมื่อเรียกใช้รหัส Python ในสคริปต์ที่สามารถเรียกทำงานได้

เมื่อ shebang ไม่ทำงาน

ในตัวอย่างที่เตรียมและทดสอบของฉันการเรียกใช้hello3m.pyเป็นสคริปต์ที่ปฏิบัติการได้ล้มเหลวและส่งคืนข้อผิดพลาด

$  ./hello3m.py 
./hello3m.py: line 1: #!/usr/bin/env: No such file or directory

นี่เป็นข้อ จำกัดที่ทราบว่า shebang ใช้งานไม่ได้หรือไม่ถูกต้อง เมื่อไฟล์ถูกบันทึกเป็น Unicode BOM (Byte Order Mark) มันจะล้มเหลวในการทำงานตามปกติเป็นสคริปต์ Python ที่สามารถเรียกใช้งานได้

ตัวอย่างเพิ่มเติม

ตัวอย่างเพิ่มเติมนี้จะถือว่าเป็นหลักฐานสนับสนุนเท่านั้น ผู้ใช้ควรหลีกเลี่ยงการรันตัวอย่างนี้แม้ว่าผลลัพธ์จะไม่เป็นอันตราย

ฉันสร้างไฟล์อื่นที่เรียกว่าhello1e.pyซึ่งมีไฟล์เดียวกันhello1.pyและทำให้สามารถเรียกใช้งานได้ การรันสคริปต์นี้ส่งคืนข้อผิดพลาดทางไวยากรณ์

$  ./hello1e.py 
./hello1e.py: line 2: syntax error near unexpected token `"Hello from Python %s\n"'
./hello1e.py: line 2: `sys.stdout.write("Hello from Python %s\n" % (sys.version,))'

เมื่อเรียกใช้สคริปต์นี้ในตอนแรกเคอร์เซอร์ของเมาส์จะถูกเปลี่ยนเป็นเครื่องหมายบวกและไม่ทำอะไรเลย ข้อผิดพลาดทางไวยากรณ์จะไม่ปรากฏจนกว่าฉันจะคลิกบนหน้าต่างเดสก์ท็อปหรือเทอร์มินัล จากนั้นสคริปต์นี้จะสร้างsysไฟล์ในไดเรกทอรีเดียวกับสคริปต์

$  file sys
sys: PostScript document text conforming DSC level 3.0, Level 1

sysไฟล์ที่ได้รับการระบุว่าเป็นไฟล์ PostScript โดยไม่มีนามสกุลไฟล์ ไฟล์นี้สามารถเปิดได้ในโปรแกรมดูเอกสารเช่น Evince และไฟล์นั้นมีภาพหน้าจอของหน้าต่างที่ฉันคลิกไปก่อนหน้านี้ จากประสบการณ์ของฉันไฟล์อาจมีขนาดใหญ่ถึงไม่กี่เมกะไบต์

ต้องมีบรรทัด shebang อีกครั้งและสคริปต์จะต้องสามารถเรียกใช้งานได้เมื่อเรียกใช้สคริปต์ Python เป็นสคริปต์ที่สามารถเรียกทำงานได้ มิฉะนั้นสคริปต์จะทำงานผิดปกติตามที่อธิบายไว้ข้างต้น

หมายเหตุเพิ่มเติม

คำว่า "made executable" หรือ "ต้องปฏิบัติการได้" หมายถึงสิทธิ์ในการเรียกใช้สคริปต์ สิ่งนี้ทำได้โดยเรียกใช้chmod +x FILENAMEคำสั่งในเทอร์มินัลหรือโดยการตรวจสอบตัวเลือก "อนุญาตให้ไฟล์นี้ทำงานเป็นโปรแกรม" หรือบางอย่างที่คล้ายกันในหน้าต่างคุณสมบัติภายในตัวจัดการไฟล์

ในขณะที่คำตอบอื่น ๆ ที่มีอยู่ครอบคลุมเกือบทุกอย่างคำตอบนี้ใช้แนวทางที่แตกต่างกันโดยใช้ตัวอย่างการปฏิบัติเพื่ออธิบายเรื่องนี้ ไวยากรณ์ของรหัสถูกเขียนขึ้นด้วยความระมัดระวังเช่นตัวอย่างที่สามารถรันด้วย Python 2 หรือ Python 3 ตามที่เป็นอยู่

รหัส Python ได้รับการดัดแปลงจากการใช้ Python บน Windowsและการใช้ Python บนแพลตฟอร์ม Unixด้วยโค้ดหนึ่งบรรทัดเพิ่มเติมของ "Hello, World!" ที่แพร่หลาย โครงการ

รหัสและคำสั่งทั้งหมดได้รับการทดสอบอย่างสมบูรณ์และใช้งานได้ในระบบ Xubuntu 14.04 ซึ่งติดตั้ง Python 2.7 และ Python 3.4 เป็นค่าเริ่มต้น


4

ก็หมายความว่าเมื่อแฟ้มนั้นจะถูกดำเนินการเครื่องคอมพิวเตอร์ของคุณรู้ว่าจะดำเนินการได้กับโปรแกรมว่าเป็นวิธีที่คุณบอกมันนอกเหนือจากภาษาอื่นเช่นทุบตีที่คุณจะทำอย่างไร/usr/bin/python #!/bin/bashนี่คือเพื่อให้คุณสามารถเรียกใช้:

./[file-to-execute]

และจะรู้ว่าไฟล์ใดที่จะเรียกใช้งานด้วยแทนที่จะต้องระบุด้วยตัวคุณเอง:

python ./[file-to-execute].py

#!ส่วนหนึ่งจะถูกตัดสินกันทั่วไปเพื่อเป็นshebangหรือปังกระทืบ


2
ยังเป็น hashbang
Naftuli Kay

1

หากคุณติดตั้ง Python หลายรุ่น/usr/bin/envจะมั่นใจได้ว่าล่ามที่ใช้นั้นเป็นรุ่นแรกในสภาพแวดล้อมของ$PATHคุณ ทางเลือกอื่นคือการ hardcode บางอย่างเช่น#!/usr/bin/python;

ใน Unix ไฟล์ที่สามารถเรียกใช้งานได้ซึ่งหมายถึงการตีความสามารถระบุได้ว่าล่ามที่จะใช้โดย#!เริ่มต้นที่บรรทัดแรกแล้วตามด้วยล่าม

กฎนี้ใช้ได้กับระบบที่ใช้ UNIX เท่านั้น


0

มีประโยชน์สำหรับระบบปฏิบัติการเช่น Linux ที่ Python 2.x ยังคงเป็นมาตรฐาน แต่คนส่วนใหญ่ดาวน์โหลด 3.x

2.x จะทำงานตามค่าเริ่มต้น ดังนั้นรหัส 3.x ของฉันฉันนำหน้าด้วย #! / usr / bin / env python3 เพื่อให้ 3.x รันโค้ด ฉันยังสามารถระบุการแก้ไขเล็กน้อย (python 3.xyz) หากฉันเลือกที่จะมีรุ่นเบต้าหรือรุ่นที่เก่ากว่าเล็กน้อย

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