ฉันควรใส่ #! (shebang) ในสคริปต์ Python และควรใช้รูปแบบใด


829

ฉันควรใส่ shebang ในสคริปต์ Python ของฉันหรือไม่ ในรูปแบบใด

#!/usr/bin/env python 

หรือ

#!/usr/local/bin/python

เหล่านี้พกพาได้อย่างเท่าเทียมกัน? รูปแบบใดที่ใช้มากที่สุด

หมายเหตุ:ทอร์นาโดโครงการใช้ shebang ในทางตรงกันข้ามโครงการ Djangoก็ทำไม่ได้


70
อันที่สองไม่สามารถพกพาได้และจะล้มเหลวในคอมพิวเตอร์หลายเครื่องหากไม่ใช่มากที่สุด
Dietrich Epp

4
อย่างไร#!/usr/bin/pythonเมื่อเทียบกับตัวเลือกแรก? ฉันเห็นสิ่งนี้ในโค้ดตัวอย่างจำนวนมาก แก้ไข: อาจเป็นคำตอบ .. stackoverflow.com/a/2429517/1156245
geotheory


1
ฉันบอกว่าใช้มันเสมอทำไม "Zen Of Python" - บรรทัดที่ 2 - "ชัดแจ้งดีกว่าโดยนัย" python.org/dev/peps/pep-0020
JayRizzo

2
ตรงไปตรงมาไม่เป็น "ถูกต้อง" เพราะคุณในฐานะผู้เขียนไม่ทราบว่าเวอร์ชันที่ถูกต้องของ Python จะเป็นอย่างไรเมื่อสคริปต์ทำงาน มันควรเป็นหน้าที่ของตัวติดตั้งในการเพิ่ม shebang ที่ถูกต้อง
chepner

คำตอบ:


1117

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

การใช้งานที่ถูกต้องสำหรับสคริปต์ Python 3 คือ:

#!/usr/bin/env python3

ค่าเริ่มต้นนี้เป็นเวอร์ชัน 3. ล่าสุด สำหรับงูหลาม 2.7.latest การใช้งานในสถานที่ของpython2python3

ไม่ควรใช้สิ่งต่อไปนี้(ยกเว้นกรณีที่ไม่ค่อยเกิดขึ้นซึ่งคุณกำลังเขียนรหัสซึ่งเข้ากันได้กับทั้ง Python 2.x และ 3.x):

#!/usr/bin/env python

เหตุผลสำหรับคำแนะนำเหล่านี้ที่ให้ไว้ในPEP 394คือpythonสามารถอ้างถึงpython2หรือpython3ในระบบที่แตกต่างกัน ปัจจุบันอ้างถึงการpython2กระจายส่วนใหญ่ แต่อาจมีการเปลี่ยนแปลงในบางจุด

นอกจากนี้ห้ามใช้:

#!/usr/local/bin/python

"python อาจถูกติดตั้งที่ / usr / bin / python หรือ / bin / python ในกรณีเหล่านั้น #! # ด้านบนจะล้มเหลว"

- "#! / usr / bin / env python" vs "#! / usr / local / bin / python"


4
@EliasVanOotegem หากคุณไม่สามารถมั่นใจได้ว่าจะพบ python ในตัว/usr/binคุณจะแน่ใจได้อย่างไรว่าenvจะพบ/usr/binได้ หากมีการติดตั้ง python ในสถานที่ที่ไม่ได้มาตรฐานก็หมายความว่า python นั้นถูกติดตั้งด้วยวิธีที่ไม่ได้มาตรฐานและสคริปต์ควรล้มเหลวอย่างรวดเร็วตามผลลัพธ์ ตรงข้ามกับการตั้งสมมติฐานเกี่ยวกับคุณสมบัติของล่ามไพ ธ อนและหวังว่าจะดีที่สุด
Dunes

65
@Dunes: envจะเสมอจะพบใน/usr/bin/และในงานของตนคือการหาถังขยะ (เช่นงูหลาม) PATHโดยใช้ ไม่ว่าจะติดตั้ง python อย่างไรพา ธ นั้นจะถูกเพิ่มลงในตัวแปรนี้และenvจะค้นหาได้ (ถ้าไม่ใช่จะไม่มีการติดตั้ง python) นั่นคืองานของenvนั่นคือเหตุผลทั้งหมดว่าทำไมมันมีอยู่ เป็นสิ่งที่แจ้งเตือนสภาพแวดล้อม (ตั้งค่าตัวแปร env รวมถึงเส้นทางการติดตั้งและรวมถึงเส้นทาง) ผู้คนเข้าใจดีอยู่เสมอว่าคำสั่งนี้ใช้ได้เฉพาะในกรณีที่พบในสถานที่เดียวกัน นั่นเป็นเพียงการให้
Elias Van Ootegem

3
@JFSebastian: ถูกต้องไม่รับประกันหรือบังคับใช้โดยมาตรฐาน POSIX ฉันสันนิษฐานว่าเป็นเพราะหนึ่งใน IEEE รุ่นที่ใหม่กว่านั้นมีบางสิ่งที่เป็นสภาพแวดล้อม ไม่ว่าจะด้วยวิธีใด: ไม่/usr/bin/envได้รับการรับรองมาตรฐานใด ๆ นอกเหนือจากกฎที่ใช้กันอย่างแพร่หลาย (ในระดับสากลหรือไม่)
Elias Van Ootegem

6
หากคุณใช้ virtualenv, #! / usr / local / bin / python แม้จะมีอยู่ก็ยังผิดปกติ
nullas

6
ปัญหาหนึ่งด้วยนี้ตามPEP394เพียงคนเดียวควรใช้pythonปฏิบัติการเมื่อสคริปต์เข้ากันได้กับงูหลาม 2 และ Python 3. มิฉะนั้นก็ควรชี้ไปที่ตัวเลือกที่เหมาะสมจากและpython2 python3
amiller27

67

มันเป็นเรื่องของรสนิยมจริงๆ การเพิ่ม shebang หมายถึงผู้ใช้สามารถเรียกใช้สคริปต์ได้โดยตรงหากพวกเขาต้องการ (สมมติว่ามันถูกทำเครื่องหมายว่าสามารถใช้งานได้); ไม่ต้องpythonมีการเรียกใช้ด้วยตนเอง

ผลลัพธ์สุดท้ายของการรันโปรแกรมไม่ได้รับผลกระทบทั้งสองทาง เป็นเพียงตัวเลือกของวิธีการ


3
นั่นเป็นเพียง - ไม่สำคัญว่าคุณจะเลือกข้างไหนเพราะไม่มีด้าน "ถูก" เป็นการตัดสินใจเชิงอัตวิสัยอย่างสมบูรณ์
เหลืองอำพัน

5
ไม่มากไปกว่าการตัดสินใจเรื่องเล็กน้อยอื่น ๆ en.wikipedia.org/wiki/Parkinson's_Law_of_Triviality
แอมเบอร์

2
ฉันจะรันไฟล์ python โดยตรงโดยไม่ต้องใช้คำสั่ง 'python' ได้อย่างไร
Zen

5
@Zen สมมติว่าคุณรวม shebang (#! / usr / bin / env python) ไว้ในสคริปต์ของคุณคุณต้องทำให้สคริปต์ของคุณทำงานได้ สิ่งที่ชอบchmod a+x [your-script].pyควรทำให้มันใช้งานได้และจากนั้นคุณสามารถเรียกใช้./[your-script.py]ในเชลล์
skålfyfan

9
ตามที่คำตอบของ GlassGhost ชี้ไปที่นั่น เป็นข้อได้เปรียบที่เป็นรูปธรรมเพื่อรวมไว้นอกเหนือจากรสชาติ: มันทำให้ชัดเจนให้กับผู้อ่านในอนาคตของแฟ้มที่พวกเขากำลังอ่านสคริปต์ปฏิบัติการมากกว่าไฟล์ที่หมายที่จะนำเข้า ในทำนองเดียวกันกับตัวดัดแปลงการควบคุมการเข้าถึงสาธารณะ / ส่วนตัวในภาษาที่มีพวกเขา Shebangs มีประโยชน์เป็นเอกสารประกอบเช่นเดียวกับผลกระทบที่เกิดขึ้นจริงและในบางกรณีด้านเอกสารประกอบนั้นสำคัญมากที่สุด
Mark Amery

32

ฉันควรใส่ shebang ในสคริปต์ Python ของฉันหรือไม่

ใส่ Shebang ลงในสคริปต์ Python เพื่อระบุ:

  • โมดูลนี้สามารถเรียกใช้เป็นสคริปต์
  • ไม่ว่าจะสามารถทำงานได้เฉพาะกับ python2, python3 หรือเป็น Python 2/3
  • บน POSIX มีความจำเป็นหากคุณต้องการรันสคริปต์โดยตรงโดยไม่ต้องเรียกใช้งานได้pythonอย่างชัดเจน

เหล่านี้พกพาได้อย่างเท่าเทียมกัน? รูปแบบใดที่ใช้มากที่สุด

หากคุณเขียน Shebang ด้วยตนเองให้ใช้ทุกครั้ง#!/usr/bin/env pythonเว้นแต่ว่าคุณมีเหตุผลเฉพาะที่จะไม่ใช้ เข้าใจแบบฟอร์มนี้ได้แม้ใน Windows (Python launcher)

หมายเหตุ: การติดตั้งสคริปต์ควรใช้เฉพาะหลามปฏิบัติการเช่นหรือ/usr/bin/python /home/me/.virtualenvs/project/bin/pythonมันจะไม่ดีถ้ามีเครื่องมือบางอย่างแตกถ้าคุณเปิดใช้งาน virtualenv ในเปลือกของคุณ โชคดีที่ shebang ที่ถูกต้องนั้นถูกสร้างขึ้นโดยอัตโนมัติในกรณีส่วนใหญ่โดยsetuptoolsหรือเครื่องมือแพ็คเกจการแจกจ่ายของคุณ (บน Windows setuptoolsสามารถสร้าง.exeสคริปต์ตัวตัดคำโดยอัตโนมัติ)

ในคำอื่น ๆ #!/usr/bin/env pythonถ้าสคริปต์ที่อยู่ในแหล่งที่มาเช็คเอาท์แล้วคุณอาจจะเห็น หากมีการติดตั้ง shebang จะเป็นพา ธ ไปยังไฟล์ python ที่สามารถใช้งานได้เช่น#!/usr/local/bin/python (หมายเหตุ: คุณไม่ควรเขียนพา ธ จากหมวดหมู่หลังด้วยตนเอง)

เพื่อเลือกว่าคุณควรใช้ python , python2หรือpython3ใน shebang ให้ดูPEP 394 - ทีม "งูใหญ่" คำสั่งบน Unix เหมือนระบบ :

  • ... pythonควรใช้ในบรรทัด shebang สำหรับสคริปต์ที่เข้ากันได้กับทั้ง Python 2 และ 3 เท่านั้น

  • ในการเตรียมตัวสำหรับการเปลี่ยนแปลงครั้งสุดท้ายในเวอร์ชันเริ่มต้นของ Python สคริปต์ Python 2 เท่านั้นที่ควรได้รับการอัปเดตให้เป็นแหล่งที่เข้ากันได้กับ Python 3 หรืออย่างอื่นเพื่อใช้python2ในบรรทัด Shebang


3
คำตอบแรกในการอ้างถึง PEP แม้มี upvotes ไม่เพียงพอ ฮะ? มี PEP สำหรับ#!/usr/bin/env pythonตัวเองหรือไม่?
binki

#!/usr/bin/env pythonกรุณาอย่าใช้ กรุณาอย่าแนะนำให้ #!/usr/bin/env python"มักจะใช้" นี่เป็นสิ่งที่ผิดที่ต้องทำใน 99% ของกรณี (สาเหตุที่คุณรวมไว้ในคำตอบของคุณ)
Jay Sullivan

1
@JaySullivan คุณเข้าใจถึงความแตกต่างระหว่างการชำระเงินต้นทางและสคริปต์ที่ติดตั้งหรือไม่ ฉันยืนอยู่ข้างหลังข้อเสนอแนะ มันใช้งานได้ดี
jfs

1
@jfs: หลังจากอ่านความคิดเห็นของฉันอีกครั้งฉันเห็นว่าฉันล้มเหลวอย่างสิ้นเชิงเพื่อให้ได้คะแนนมา สิ่งที่ฉันหมายถึงคือคนส่วนใหญ่ต้องการใช้ 'python2' หรือ 'python3' ไม่ใช่ 'python' ไม่ว่าจะแก้ปัญหาผ่านเส้นทางแบบเต็มหรือ env ซึ่งในทางเทคนิคเป็นคำถาม OP คุณได้ตอบแล้วและฉันไม่เห็นด้วยกับประเด็นนั้น
Jay Sullivan

@JaySullivan ฉันเห็นด้วย คุณอ่านคำพูดจาก pep ในคำตอบหรือไม่ มันพูดในสิ่งเดียวกัน
jfs

15

หากคุณมี Python มากกว่าหนึ่งเวอร์ชันและสคริปต์จำเป็นต้องทำงานภายใต้เวอร์ชันที่เฉพาะเจาะจง She-bang สามารถตรวจสอบให้แน่ใจว่ามีการใช้งานที่ถูกต้องเมื่อสคริปต์ถูกเรียกใช้งานโดยตรงตัวอย่างเช่น:

#!/usr/bin/python2.7

โปรดทราบว่าสคริปต์ยังคงสามารถเรียกใช้ผ่านบรรทัดคำสั่ง Python ที่สมบูรณ์หรือผ่านการนำเข้าซึ่งในกรณีนี้ she-bang จะถูกละเว้น แต่สำหรับสคริปต์ทำงานโดยตรงนี่คือเหตุผลที่เหมาะสมในการใช้ she-bang

#!/usr/bin/env python โดยทั่วไปแล้วเป็นวิธีที่ดีกว่า แต่สิ่งนี้จะช่วยในกรณีพิเศษ

โดยปกติแล้วจะเป็นการดีกว่าที่จะสร้างสภาพแวดล้อมเสมือน Python ซึ่งในกรณีทั่วไป#!/usr/bin/env pythonจะระบุอินสแตนซ์ที่ถูกต้องของ Python สำหรับ virtualenv


พื้นที่ว่างที่จะทำให้เกิดความล้มเหลวหรือไม่
RandomInsano

1
@ RandomInsano ฉันไม่คิดอย่างนั้น ดูเหมือนว่าช่องว่างนั้นค่อนข้างธรรมดาและมีหลักฐานมากมายรอบ ๆ 'สิ่งนี้เป็นการใช้ที่ยอมรับได้ อย่างไรก็ตามฉันคิดว่าไม่มีที่ว่างน่าจะเป็นการใช้ที่ยอมรับได้มากกว่า
Chris Johnson

1
คุณพูดถูกเกี่ยวกับเรื่องนี้อย่างแน่นอน เพิ่งทดสอบกับ bash และ tcsh
RandomInsano

ผลลัพธ์ของการwhichจะให้สตริงที่จะทำงานระยะเวลา คุณไม่จำเป็นต้องกังวลเกี่ยวกับความกล้าในการใช้งาน
SDsolar

10

คุณควรเพิ่ม Shebang หากสคริปต์นั้นต้องการให้เรียกใช้งานได้ คุณควรติดตั้งสคริปต์ด้วยซอฟต์แวร์การติดตั้งที่แก้ไข shebang ให้ถูกต้องเพื่อให้ทำงานบนแพลตฟอร์มเป้าหมาย ตัวอย่างของสิ่งนี้คือ distutils และ Distribute


1
คุณไม่ต้องแก้ไข #! บรรทัดต่อมา นั่นคือสิ่งที่ / usr / bin / env สำหรับ การเข้ารหัสอย่างหนักกับล่าม Python ที่เฉพาะเจาะจงอาจทำอันตรายมากกว่าดี มันเปราะบางมากเกี่ยวกับการติดตั้ง Python รุ่นอื่นหรือสลับระหว่าง Python ของ distro ของเรากับการติดตั้ง Python แบบกำหนดเอง
58

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

9

วัตถุประสงค์ของ shebang มีไว้สำหรับสคริปต์ที่จะรับรู้ประเภทของล่ามเมื่อคุณต้องการรันสคริปต์จากเชลล์ ส่วนใหญ่และไม่เสมอไปที่คุณเรียกใช้งานสคริปต์โดยการจัดหาล่ามจากภายนอก ตัวอย่างการใช้งาน:python-x.x script.py

สิ่งนี้จะใช้ได้แม้ว่าคุณจะไม่มีผู้ประกาศ Shebang

สาเหตุแรกคือ "พกพา" มากกว่าเพราะ/usr/bin/envมีของคุณPATHการประกาศที่บัญชีสำหรับปลายทางทั้งหมดที่ระบบปฏิบัติการของคุณอยู่

หมายเหตุ: ทอร์นาโดไม่ได้ใช้ shebangs อย่างเคร่งครัดและ Django ก็ไม่ได้ใช้อย่างเด็ดขาด มันแตกต่างกันไปตามวิธีที่คุณใช้งานฟังก์ชั่นหลักของแอปพลิเคชันของคุณ

นอกจากนี้: มันไม่ได้แตกต่างกับ Python


8

บางครั้งถ้าคำตอบไม่ชัดเจนมาก (ฉันหมายความว่าคุณไม่สามารถตัดสินใจได้ว่าใช่หรือไม่) ก็ไม่สำคัญเกินไปและคุณสามารถเพิกเฉยต่อปัญหาได้จนกว่าคำตอบจะชัดเจน

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

#!โดยทั่วไปถ้ามันเป็นโมดูลและไม่สามารถนำมาใช้เป็นสคริปต์มีความจำเป็นสำหรับการใช้ไม่มี ในทางกลับกันแหล่งโมดูลมักจะมีif __name__ == '__main__': ...อย่างน้อยการทดสอบเล็กน้อยของการทำงาน จากนั้น#!ทำให้รู้สึกอีกครั้ง

เหตุผลที่ดีสำหรับการใช้งาน#!คือเมื่อคุณใช้ทั้งสคริปต์ Python 2 และ Python 3 สคริปต์เหล่านั้นต้องตีความโดย Python เวอร์ชันต่าง ๆ วิธีนี้คุณต้องจำสิ่งที่pythonต้องใช้เมื่อเรียกใช้สคริปต์ด้วยตนเอง (โดยไม่ต้องใช้#!ภายใน) หากคุณมีการผสมผสานของสคริปต์ดังกล่าวมันเป็นความคิดที่ดีที่จะใช้#!ภายในทำให้พวกเขาปฏิบัติการและเปิดพวกเขาเป็นปฏิบัติการ (chmod ... )

เมื่อใช้ MS-Windows #!ไม่มีความหมายจนกระทั่งเมื่อไม่นานมานี้ Python 3.3 แนะนำ Windows Python Launcher (py.exe และ pyw.exe) ที่อ่าน#!บรรทัดตรวจพบ Python เวอร์ชันที่ติดตั้งและใช้ Python เวอร์ชันที่ถูกต้องหรือต้องการอย่างชัดเจน เนื่องจากส่วนขยายสามารถเชื่อมโยงกับโปรแกรมคุณสามารถรับพฤติกรรมที่คล้ายกันใน Windows เช่นเดียวกับการดำเนินการตั้งค่าสถานะในระบบที่ใช้ Unix


3

เมื่อฉันติดตั้ง Python 3.6.1 บน Windows 7 เมื่อเร็ว ๆ นี้มันก็ติดตั้ง Python Launcher สำหรับ Windows ซึ่งควรจะจัดการกับสาย Shebang อย่างไรก็ตามฉันพบว่า Python Launcher ไม่ได้ทำสิ่งนี้: บรรทัด shebang ถูกละเว้นและ Python 2.7.13 มักจะถูกใช้เสมอ (เว้นแต่ฉันจะเรียกใช้สคริปต์โดยใช้ py -3)

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\commandเพื่อแก้ไขปัญหานี้ผมต้องแก้ไขคีย์รีจิสทรีของ Windows สิ่งนี้ยังคงมีค่า

"C:\Python27\python.exe" "%1" %*

จากการติดตั้ง Python 2.7 ก่อนหน้าของฉัน ฉันแก้ไขค่าคีย์รีจิสทรีนี้เป็น

"C:\Windows\py.exe" "%1" %*

และการประมวลผลบรรทัด Python Launcher ของ shebang ทำงานตามที่อธิบายไว้ข้างต้น


2

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

#!/bin/sh
#
# Choose the python we need. Explanation:
# a) '''\' translates to \ in shell, and starts a python multi-line string
# b) "" strings are treated as string concat by python, shell ignores them
# c) "true" command ignores its arguments
# c) exit before the ending ''' so the shell reads no further
# d) reset set docstrings to ignore the multiline comment code
#
"true" '''\'
PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    echo Using preferred python $PREFERRED_PYTHON
    exec $PREFERRED_PYTHON "$0" "$@"
elif [ -x $ALTERNATIVE_PYTHON ]; then
    echo Using alternative python $ALTERNATIVE_PYTHON
    exec $ALTERNATIVE_PYTHON "$0" "$@"
else
    echo Using fallback python $FALLBACK_PYTHON
    exec python3 "$0" "$@"
fi
exit 127
'''

__doc__ = """What this file does"""
print(__doc__)
import platform
print(platform.python_version())

หรือบางทีอาจจะดีกว่าเพื่ออำนวยความสะดวกในการนำโค้ดกลับมาใช้ใหม่ในสคริปต์หลามหลายตัว

#!/bin/bash
"true" '''\'; source $(cd $(dirname ${BASH_SOURCE[@]}) &>/dev/null && pwd)/select.sh; exec $CHOSEN_PYTHON "$0" "$@"; exit 127; '''

แล้ว select.sh มี:

PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    CHOSEN_PYTHON=$PREFERRED_PYTHON
elif [ -x $ALTERNATIVE_PYTHON ]; then
    CHOSEN_PYTHON=$ALTERNATIVE_PYTHON
else
    CHOSEN_PYTHON=$FALLBACK_PYTHON
fi

1
ในขณะที่ฉันไม่แน่ใจว่ารูปหลายเหลี่ยมแบบนี้เป็นแนวปฏิบัติที่ดีโดยทั่วไปมันเป็นวิธีที่น่าสนใจมากและอาจเป็นคำตอบที่ยืดหยุ่นที่สุดที่นี่
Ryan Amos

1
เด็ดมาก ฉันไม่ทราบว่าคุณสามารถทำได้
user2233949

1

คำตอบ: ถ้าคุณวางแผนที่จะทำให้มันเป็นสคริปต์ที่ปฏิบัติการบรรทัดคำสั่ง

นี่คือขั้นตอน:

เริ่มต้นด้วยการยืนยันสตริง shebang ที่เหมาะสมเพื่อใช้:

which python

ใช้เอาต์พุตจากนั้นและเพิ่ม (ด้วย shebang #!) ในบรรทัดแรก

ในระบบของฉันมันตอบสนองเช่นนั้น:

$which python
/usr/bin/python

ดังนั้นรูปแบบของคุณจะเป็นดังนี้:

#!/usr/bin/python

หลังจากบันทึกแล้วจะยังคงทำงานเหมือนเดิมเนื่องจาก python จะเห็นบรรทัดแรกเป็นความคิดเห็น

python filename.py

หากต้องการให้มันเป็นคำสั่งให้คัดลอกเพื่อวางส่วนขยาย. py

cp filename.py filename

บอกระบบไฟล์ว่าสิ่งนี้จะสามารถเรียกใช้งานได้:

chmod +x filename

เพื่อทดสอบใช้:

./filename

แนวปฏิบัติที่ดีที่สุดคือย้ายมันไปไว้ที่ $ PATH ของคุณดังนั้นสิ่งที่คุณต้องพิมพ์ก็คือชื่อไฟล์นั่นเอง

sudo cp filename /usr/sbin

ด้วยวิธีนี้มันจะทำงานได้ทุกที่ (โดยไม่ต้อง. / หน้าชื่อไฟล์)


ฉันสงสัยว่านี่คือการปฏิบัติที่ดีที่สุดและผมขอแนะนำให้ใช้วิธีการแก้ปัญหาของ GlassGhost
colidyre

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

0

แอบโซลูท vs เส้นทางตรรกะ:

นี่เป็นคำถามเกี่ยวกับเส้นทางของล่าม Python ที่ควรจะเป็นแบบสัมบูรณ์หรือLogical ( /usr/bin/env) ที่เกี่ยวกับการพกพา

เผชิญหน้ากับคำตอบอื่น ๆ เกี่ยวกับเรื่องนี้และเว็บไซต์กองอื่น ๆ ที่พูดคุยเกี่ยวกับปัญหาในลักษณะทั่วไปโดยไม่ต้องพิสูจน์สนับสนุนผมได้ดำเนินการบางอย่างจริงๆจริงๆทดสอบที่ละเอียดและการวิเคราะห์เกี่ยวกับคำถามนี้มากในunix.stackexchange.com แทนที่จะวางคำตอบนั้นไว้ที่นี่ฉันจะชี้ให้ผู้ที่สนใจในการวิเคราะห์เปรียบเทียบกับคำตอบนั้น:

https://unix.stackexchange.com/a/566019/334294

การเป็นวิศวกร Linux เป้าหมายของฉันคือการจัดหาโฮสต์ที่เหมาะสมที่สุดและเหมาะสมที่สุดสำหรับลูกค้านักพัฒนาของฉันดังนั้นปัญหาของสภาพแวดล้อม Python จึงเป็นสิ่งที่ฉันต้องการคำตอบที่ชัดเจน มุมมองของฉันหลังจากการทดสอบคือเส้นทางตรรกะใน she-bang เป็นตัวเลือกที่ดีกว่า (2)


-3

ใช้ก่อน

which python

สิ่งนี้จะให้ผลลัพธ์เป็นที่ตั้งของตัวแปลหลาม (ไบนารี) ของฉัน

ผลลัพธ์นี้อาจเป็นเช่น

/usr/bin/python

หรือ

/bin/python

ตอนนี้เลือกเส้น shebang อย่างเหมาะสมและใช้งาน

ในการพูดคุยทั่วไปเราสามารถใช้:

#!/usr/bin/env

หรือ

#!/bin/env

3
สิ่งนี้อาจจะไม่สามารถพกพาไปยังระบบอื่นได้ #!/usr/bin/envทำให้ทางเลือกที่เหมาะสมสำหรับคุณ
fragmentedreality

นั่นเป็นเหตุผลที่คุณใช้whichคำสั่ง - มันจะส่งคืนสตริงที่ถูกต้องสำหรับระบบของคุณโดยเฉพาะ
SDsolar

1
... และทุกครั้งที่สคริปต์ถูกเรียกใช้บนเครื่องอื่นคุณจะรันwhich pythonอีกครั้งและเปลี่ยนสคริปต์หากเอาต์พุตแตกต่างจาก shebang ปัจจุบัน
fragmentedreality

2
-1 นี่คือทางออกที่เปราะบางที่สุด มันรับประกันว่าจะถูกต้องสำหรับระบบที่เขียนสคริปต์ของหลามเท่านั้น ใช้ #! / usr / bin / env python3 เพื่อความสะดวกในการพกพา
Myles Hollowed
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.