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



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

แต่ถ้าจะรันโดยตรงเราต้องมีสิทธิ์ทั้งการอ่านไฟล์และการรันไฟล์ด้วยในขณะเดียวกัน

สามารถดูสิทธิ์ได้ด้วยการพิมพ์คำสั่ง 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. กำหนดสิทธิ์ให้ไฟล์รันได้และอ่านได้



อนึ่ง เนื่องจากเนื้อหาในหน้านี้มีการใช้คำสั่งเชลยูนิกซ์ ซึ่งเข้าใจยากสำหรับคนที่ไม่มีพื้นฐาน และในนี้ไม่ได้อธิบายรายละเอียดไว้เนื่องจากกลัวว่าจะยาวไป

แต่ขณะนี้กำลังเตรียมจะเขียนเนื้อหาเรื่องการใช้เชลยูนิกซ์เบื้องต้นอยู่ มีแผนจะลงในบล็อกนี้ในไม่ช้า



อ้างอิง


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

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

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

หมวดหมู่

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

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

目录

从日本来的名言
python
-- numpy
-- matplotlib

-- pandas
-- pytorch
maya
机器学习
-- โครงข่าย
     ประสาทเทียม
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



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

  查看日志

  推荐日志

หลักการเขียนทับศัพท์ภาษาจีนกลาง
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
บ้านเก่าของจางเสวียเหลียงในเทียนจิน
เที่ยวจิ่นโจว ๓ วัน ๒ คืน 23 - 25 พ.ค. 2015
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
บันทึกการเที่ยวสวีเดน 1-12 พ.ค. 2014
แนะนำองค์การวิจัยและพัฒนาการสำรวจอวกาศญี่ปุ่น (JAXA)
เที่ยวฮ่องกงในคืนคริสต์มาสอีฟ เดินทางไกลจากสนามบินมาทานติ่มซำอร่อยโต้รุ่ง
เล่าประสบการณ์ค่ายอบรมวิชาการทางดาราศาสตร์โดยโซวเคนได 10 - 16 พ.ย. 2013
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
บันทึกการเที่ยวญี่ปุ่นครั้งแรกในชีวิต - ทุกอย่างเริ่มต้นที่สนามบินนานาชาติคันไซ
หลักการเขียนคำทับศัพท์ภาษาญี่ปุ่น
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ
ทำไมถึงอยากมาเรียนต่อนอก
เหตุผลอะไรที่ต้องใช้ภาษาวิบัติ?

各月日志

2019年

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

2018年

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

2017年

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

2016年

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

2015年

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

找更早以前的日志