φυβλαςのβλογ
phyblas的博客



วิธีการรัน python โดยตรงใน unix shell ใน mac และ linux
เขียนเมื่อ 2019/01/08 15:05
แก้ไขล่าสุด 2021/09/28 16:42
ปกติแล้วเวลาที่ต้องการรันไพธอนในคอมมานด์ไลน์จะต้องพิมพ์ 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



อ้างอิง


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python
-- คอมพิวเตอร์ >> shell

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

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  查看日志

  推荐日志

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ