φυβλαςのβλογ
บล็อกของ 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
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



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

  ค้นหาบทความ

  บทความแนะนำ

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

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文