ปกติแล้วเวลาที่ต้องการรันไพธอนในคอมมานด์ไลน์จะต้องพิมพ์ python แล้วตามด้วยชื่อไฟล์ เช่น
python 123.py
แต่ว่าสำหรับเวลาที่ใช้เชลยูนิกซ์ (unix shell) เช่นใน mac หรือ linux แล้ว ยังมีวิธีที่สามารถทำให้ไพธอนสามารถรันโดยตรง คือพิมพ์ชื่อไฟล์ หรือขึ้นด้วย ./ แล้วเป็นการรันได้เลย ไม่ต้องพิมพ์ python แล้วเว้นวรรค (ประหยัดการพิมพ์ไปได้ ๕-๖ ตัวอักษรแน่ะ!)
ปกติแล้วไฟล์โปรแกรมต่างๆใน mac หรือ linux เมื่อเราควบคุมผ่านเชลยูนิกซ์จะสามารถทำการสั่งรันได้โดยพิมพ์ชื่อไฟล์นั้น
เพียงแต่ว่า เวลาที่สั่งรันจะต้องมีตัวมาบอกให้เชลมันรู้ว่ารันด้วยวิธีไหน ใช้คำสั่งอะไรรัน
ปกติการที่เรารู้ว่าไฟล์นี้เป็นไฟล์ไพธอนและต้องรันในไพธอนได้ก็เพราะว่าเห็นชื่อไฟล์ลงท้ายด้วย .py แต่ว่าจริงๆนี่เป็นแค่ชื่อที่ตั้งขึ้นเพื่อให้เข้าใจง่ายเท่านั้น ตัวเชลเองไม่สามารถเข้าใจได้
เพื่อที่จะให้เชลรู้ว่านี่เป็นไฟล์ไพธอน จำเป็นต้องเขียนสิ่งที่เรียกว่า shebang ไว้ที่ต้นไฟล์
shebang คือข้อความที่ขึ้นต้นด้วย #! เขียนไว้ที่บรรทัดแรกของไฟล์เพื่อบอกให้เชลยูนิกซ์รู้ว่าควรจะไปรันไฟล์นี้ที่ไหน
กรณีไพธอนให้ใส่ว่า
#!/usr/bin/env python
พอเขียนแบบนี้แล้วเครื่องก็จะเท่ากับเป็นการรันด้วยการพิมพ์ python ตามด้วยชื่อไฟล์ คือจะเป็นการรันด้วยไพธอนที่อยู่ในพาธที่ตั้งไว้อันแรก (พิมพ์ which python ดูจะขึ้นว่าใช้ไพธอนตัวไหนอยู่)
หรือกรณีที่ในเครื่องเรามีไพธอนลงไว้หลายตัวก็อาจจะระบุตำแหน่งของไพธอนที่ต้องการให้รัน เช่น
#!/anaconda3/bin/python
เพียงแต่วิธีนี้ให้ใช่แค่เมื่อจะรันในเครื่องตัวเองเท่านั้น เพราะถ้าไปรันเครื่องอื่นแล้วเขาไม่ได้ลง python ไว้ที่เดียวกันก็จะใช้ไม่ได้
ปกติแล้วในไพธอน ข้อความที่ตามหลังอักษร # จะไม่มีการอ่านอยู่แล้ว ดังนั้นการใส่ shebang ไว้จึงไม่มีผลเวลารันไพธอนเลย ดังนั้นในกรณีทั่วไปต่อให้ไม่ได้จะรันผ่านเชลยูนิกซ์จะเขียน shebang ไว้ก็ไม่ได้มีผลช้างเคียงอะไร
ขอยกตัวอย่างการใช้อย่างง่ายๆ สมมุติว่าสร้างไฟล์ชื่อ 123.py ขึ้นมา ด้านในเขียนตามนี้
#!/usr/bin/env python
print("%d+%d=%d"%(1,2,1+2))
บรรทัดแรกคือ shebang ส่วนบรรทัดหลังก็คือโค้ด python ง่ายๆ
จากนั้นไปที่โฟลเดอร์ที่บันทึกไฟล์ไว้แล้วสั่ง
./123.py
แล้วก็จะได้ว่า
bash: ./123.py: Permission denied
あれ อ้าว!?
ปรากฏว่าพอรันดูจริงๆก็จะพบว่าเจอ Permission denied ก็คือปัญหาเรื่องสิทธิ์ในการรัน
ที่จริงแล้วคือปกติแล้วใน mac หรือ linux ไฟล์ที่ถูกสร้างขึ้นมาใหม่เราจะมีสิทธิ์ในการอ่านเขียนแต่จะไม่มีสิทธิ์รัน
ถ้ารันไพธอนด้วยการพิมพ์ python ตามด้วยชื่อจะเป็นการให้โปรแกรมไปอ่านโค้ดไปธอนในไฟล์ ไม่ใช่การสั่งรันไฟล์โดยตรง ดังนั้นขอแค่มีสิทธิ์ในการอ่านก็สามารถรันไฟล์ได้
แต่ถ้าจะรันโดยตรงเราต้องมีสิทธิ์ทั้งการอ่านไฟล์และการรันไฟล์ด้วยในขณะเดียวกัน
เกี่ยวกับเรื่องสิทธิ์ของไฟล์นั้นในที่นี้จะอธิบายแค่คร่าวๆเท่านั้น รายละเอียดสามารถอ่านได้ที่บทความนี้
https://phyblas.hinaboshi.com/20190126เราสามารถดูสิทธิ์ของไฟล์ได้ด้วยการพิมพ์คำสั่ง ls -l
ls -l 123.py
-rw-r--r-- 1 phyblas phyblas 26 Jan 8 15:27 123.py
ทางซ้ายสุดที่เขียนว่า -rw-r--r-- นี้คือสิทธิ์ในการทำอะไรกับไฟล์ รายละเอียดถ้าเขียนถึงตรงนี้จะยาว แต่สรุปสั้นๆก็คือถ้ามีตัว r เราจะอ่านไฟล์ได้ ถ้ามีตัว w จะเขียนหรือแก้ไขไฟล์ได้ ถ้ามีตัว x จะสามารถรันไฟล์ได้
แต่ในที่นี้ไม่มีตัว x จึงรันไม่ได้ ดังนั้นต้องไปแก้ให้มีตัว x เพื่อจะได้รันได้ สามารถทำได้โดยพิมพ์คำสั่ง chmod
chmod u+x 123.py
จากนั้น ls -l 123.py ดูใหม่จะพบว่ามีตัว x โผล่ขึ้นมาแล้ว
-rwxr--r-- 1 phyblas phyblas 26 Jan 8 15:27 123.py
เท่านี้ก็จะสามารถรันได้
อย่างไรก็ตาม ถ้าเราไม่มีสิทธิ์ในการอ่านไฟล์ จะรันด้วยวิธีไหนก็ไม่ได้ทั้งนั้น ต่อให้มีสิทธิ์ในการรันก็ตาม ดังนั้นสิทธิ์ในการอ่านไฟล์สำคัญกว่ามาก
เช่นถ้าลองลบสิทธิ์ในการอ่านทิ้งโดยพิมพ์ chmod u-r 123.py แบบนี้รันดูก็จะล้มเหลว
โดยสรุปแล้วก็คือ การจะทำให้ไพธอนรันโดยตรงในเชลยูนิกซ์ได้จำเป็นต้อง
1. ใส่ shebang #!
2. กำหนดสิทธิ์ให้ไฟล์รันได้และอ่านได้
อนึ่ง เนื่องจากเนื้อหาในหน้านี้มีการใช้คำสั่งเชลยูนิกซ์ ซึ่งเข้าใจยากสำหรับคนที่ไม่มีพื้นฐาน และในนี้ไม่ได้อธิบายรายละเอียดไว้เนื่องจากกลัวว่าจะยาวไป
พื้นฐานเรื่องการใช้เชลยูนิกซ์สามารถอ่านได้ใน
https://phyblas.hinaboshi.com/20190125 อ้างอิง