วัตถุประสงค์ของ #! / usr / bin / python3


160

ฉันสังเกตสิ่งนี้ในสองภาษาสคริปต์ แต่ในตัวอย่างนี้ฉันใช้ไพ ธ อน ในบทเรียนจำนวนมากพวกเขาจะเริ่มด้วย#!/usr/bin/python3บรรทัดแรก ฉันไม่เข้าใจว่าทำไมเรามีสิ่งนี้

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

หากมีสิ่งใดฉันเห็นการทำลายสคริปต์ไพ ธ อนเนื่องจากเหตุผลด้านบน



9
ฉันมาที่คำถามนี้เพียงเพื่อคัดลอกสตริง shebang
omerjerk

คำตอบ:


260

#!/usr/bin/python3เป็นบรรทัด shebang

เส้น Shebang กำหนดตำแหน่งที่ล่าม ในกรณีนี้ที่ล่ามอยู่ในpython3 /usr/bin/python3shebang บรรทัดนี้ยังอาจเป็นbash, ruby, perlหรือล่ามภาษาสคริปต์อื่น ๆ #!/bin/bashตัวอย่างเช่น:

ไม่มีสาย shebang ./script.pyระบบปฏิบัติการไม่ได้รู้ว่ามันเป็นสคริปต์หลามแม้ว่าคุณจะตั้งค่าสถานะการดำเนินการในสคริปต์และเรียกมันเหมือน ในการทำให้สคริปต์ทำงานโดยค่าเริ่มต้นใน python3 ให้เรียกใช้เป็นpython3 script.pyหรือตั้งค่าบรรทัด shebang

คุณสามารถใช้#!/usr/bin/env python3เพื่อความสะดวกในการพกพาข้ามระบบที่แตกต่างกันในกรณีที่พวกเขามีล่ามภาษาติดตั้งในที่ต่าง


9
ดังนั้น#! /usr/bin/env python3ควรเลือกมากกว่า#! /usr/bin/python3?
winklerrr

4
@winklerrr ใช่มันใช้กันอย่างแพร่หลายมากขึ้น
MerreM

20

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

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

หากเส้นทางสู่การปฏิบัติการของ Python นั้นผิดปกติสคริปต์จะล้มเหลว มันง่ายในการสร้างลิงค์ไปยังไฟล์ที่เรียกใช้งานได้จริงจากตำแหน่งใดก็ตามที่ระบุไว้ตามแบบแผนมาตรฐาน


12

บรรทัดนี้ช่วยค้นหาโปรแกรมที่สามารถเรียกใช้สคริปต์ได้ สัญลักษณ์ shebang นี้เป็นมาตรฐานที่ค่อนข้างครอบคลุมในภาษาสคริปต์ส่วนใหญ่ (อย่างน้อยก็ใช้กับระบบปฏิบัติการที่โตแล้ว)

ส่วนที่สำคัญที่สุดของสายนี้คือระบุซึ่งล่ามจะถูกนำมาใช้ บน Linux ที่มีศูนย์กลางการพัฒนาจำนวนมากตัวอย่างเช่นเป็นเรื่องปกติที่จะติดตั้งหลามหลายรุ่นในเวลาเดียวกัน

Python 2.x และ Python 3 เข้ากันไม่ได้ 100% ดังนั้นความแตกต่างนี้จึงสำคัญมาก ดังนั้น#! /usr/bin/pythonและ#! /usr/bin/python3ไม่เหมือนกัน (และไม่เหมือนกันกับ#! /usr/bin/env python3ที่ระบุไว้ที่อื่นในหน้านี้


6
  1. และบรรทัดนี้เป็นวิธีการที่

  2. มันถูกละเว้น

  3. มันจะล้มเหลวในการทำงานและควรเปลี่ยนให้ชี้ไปยังตำแหน่งที่เหมาะสม หรือenvควรจะใช้

  4. มันจะล้มเหลวในการทำงานและอาจล้มเหลวในการทำงานภายใต้รุ่นอื่นโดยไม่คำนึงถึง


3

ในการชี้แจงว่าสาย shebang ทำงานกับ Windows ได้อย่างไรจากเอกสาร Python 3.7 :

  • หากบรรทัดแรกของไฟล์สคริปต์เริ่มต้นด้วย #! จะเรียกว่าบรรทัด“ shebang” Linux และ Unix อื่น ๆ เช่นระบบปฏิบัติการได้รับการสนับสนุนเนทิฟสำหรับบรรทัดดังกล่าวและมักใช้กับระบบดังกล่าวเพื่อระบุว่าสคริปต์ควรถูกเรียกใช้งานอย่างไร
  • Python Launcher สำหรับ Windows อนุญาตให้ใช้สิ่งอำนวยความสะดวกแบบเดียวกันกับสคริปต์ Python บน Windows
  • เพื่ออนุญาตให้สาย shebang ในสคริปต์ Python สามารถเคลื่อนย้ายได้ระหว่าง Unix และ Windows ตัวเรียกใช้งานสนับสนุนคำสั่ง 'virtual' จำนวนมากเพื่อระบุตัวแปลที่จะใช้ คำสั่งเสมือนที่รองรับคือ:
    • / usr / bin / env python
      • รูปแบบ / usr / bin / env ของ shebang line มีคุณสมบัติพิเศษอีกหนึ่งอย่าง ก่อนที่จะค้นหาล่าม Python ที่ติดตั้งแบบฟอร์มนี้จะค้นหา PATH ที่สามารถเรียกใช้งานได้สำหรับ Python ที่ปฏิบัติการได้ สิ่งนี้สอดคล้องกับพฤติกรรมของโปรแกรม Unix env ซึ่งทำการค้นหา PATH
    • / usr / bin / หลาม
    • / usr / local / bin / หลาม
    • หลาม

2

ที่จริงแล้วการกำหนดไฟล์ประเภทใดที่ไฟล์นั้นซับซ้อนมากดังนั้นตอนนี้ระบบปฏิบัติการไม่สามารถรู้ได้ สามารถคาดเดาได้มากมายตาม -

  • ส่วนขยาย
  • UTI
  • MIME

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

เกี่ยวกับประเด็นอื่น ๆ มันสะดวกมันเป็นไปได้ที่จะวิ่ง

python3 path/to/your/script

หากงูหลามของคุณไม่ได้อยู่ในเส้นทางที่ระบุไว้มันจะไม่ทำงาน แต่เรามักจะติดตั้งสิ่งต่าง ๆ เพื่อทำสิ่งนี้เช่นงานไม่ใช่วิธีอื่น ๆ มันไม่จริงไม่ว่าถ้าคุณอยู่ภายใต้ระวัง * shellcodeก็ขึ้นอยู่กับเปลือกของคุณไม่ว่าจะเป็นที่จะต้องพิจารณาบรรทัดนี้เพราะมันเป็น ตัวอย่างเช่นคุณสามารถทำงานbashภายใต้ Windows

คุณสามารถลบบรรทัดนี้ได้ทั้งหมดหมายความว่าผู้โทรต้องระบุล่าม อย่าวางล่ามของคุณในสถานที่ที่ไม่ได้มาตรฐานจากนั้นลองโทรหาสคริปต์โดยไม่ต้องเตรียมล่าม

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