การเรียกใช้สคริปต์หลามจาก Linux Terminal


7

ฉันได้ดาวน์โหลดสคริปต์นี้ชื่อว่า pyAES.py และใส่ไว้ในรหัสชื่อโฟลเดอร์ในไดเรกทอรี Desktop ของ Linux ของฉัน

ตามตัวอย่างนี้ http://brandon.sternefamily.net/2007/06/aes-tutorial-python-implementation/

เมื่อฉันพิมพ์

./pyAES.py -e testfile.txt -o testfile_encrypted.txt

ควรดำเนินการไฟล์ pyAES.py แต่ฉันได้รับข้อผิดพลาดนี้

pi@raspberrypi ~/Desktop/Codes $ pyAES.py
-bash: pyAES.py: command not found

ผลลัพธ์ของls -lคำสั่งคือ

pi@raspberrypi ~/Desktop/Codes $ ls -l
total 16
-rw-r--r-- 1 pi pi 14536 Oct  8 10:44 pyAES.py

นี่คือผลลัพธ์หลังจาก chmod +x

pi@raspberrypi ~/Desktop/Codes $ chmod +x pyAES.py                              pi@raspberrypi ~/Desktop/Codes $
pi@raspberrypi ~/Desktop/Codes $ pyAES.py
-bash: pyAES.py: command not found
pi@raspberrypi ~/Desktop/Codes $

และคำสั่งchmod +x pyAES.py && ./pyAES.pyให้ข้อผิดพลาดดังต่อไปนี้

-bash: ./pyAES.py: /usr/bin/python2: bad interpreter: No such file or directory

ฉันได้ลองย้ายไฟล์ใน/usr/binไดเรกทอรีแล้วก็ดำเนินการ

pi@raspberrypi /usr/bin $ pyAES.py
-bash: /usr/bin/pyAES.py: /usr/bin/python2: bad interpreter: No such file or directory
pi@raspberrypi /usr/bin $

ฉันสามารถดูไฟล์ที่มีอยู่ในไดเรกทอรี / usr / bin แต่ก็ยังให้ข้อผิดพลาดที่ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

ฉันต้องการทราบว่าทำไมเทอร์มินัล Linux ไม่เรียกใช้งานสคริปต์หลาม?


ls -lกรุณาโพสต์การส่งออกของ
จัดการ

นี่คือทั้งหมด 16 -rw-r - r-- 1 pi pi 14536 8 ต.ค. 10:44 pyAES.py
Sufiyan Ghori

1
ดังนั้นไฟล์ของคุณจะไม่สามารถเรียกใช้งานได้ เรียกใช้chmod +x pyAES.pyแล้วลองอีกครั้ง
จัดการ

1
ส่วนใหญ่อาจเป็นไฟล์ที่ไม่ chmoded python pyAES.pyหรือchmod +x pyAES.py && ./pyAES.pyควรทำงาน
Valentin Bajrami

1
@ Xufyan คุณต้องค้นหาก่อนpython2โดยพิมพ์type -p python2ดูว่าไบนารีอยู่ที่ไหนและวางไว้ในส่วนหัวของไฟล์
Valentin Bajrami

คำตอบ:


5

ดูเหมือนว่าคุณจะมีสายหนังที่เขียนไม่ดี จากข้อผิดพลาดที่คุณได้รับ:

-bash: /usr/bin/pyAES.py: /usr/bin/python2: bad interpreter: No such file or directory

ฉันว่าคุณควรตั้งค่าบรรทัดแรกของ/usr/bin/pyAES.pyเป็น

#!/correct/path/to/python

ที่/correct/path/to/pythonสามารถพบได้จากผลลัพธ์ของ:

type -P python

มันเป็น/usr/bin/python(ไม่/usr/bin/python2) ในระบบของฉัน


ขอบคุณมากมันใช้งานได้! btw จะย้ายไฟล์จาก / usr / bin ไปยัง / Desktop โดยตรงได้อย่างไร?
Sufiyan Ghori

1
@ Xufyan ถ้าคุณหมายถึงย้ายเข้าไปข้างในmvคุณจะต้องทำมันเหมือนเป็นราก แต่ไฟล์ผลลัพธ์บนเดสก์ท็อปของคุณจะเป็นเจ้าของโดยรูทดังนั้นคุณจะต้องเปลี่ยนความเป็นเจ้าของ
โจเซฟอาร์

3

อุปสรรค์แรกคือคุณต้องบอกเชลล์ว่าจะหาโปรแกรมได้ที่ไหน หากคุณไม่ใส่ตัวบ่งชี้ไดเร็กทอรีใด ๆ คุณสามารถเรียกใช้ไฟล์ที่สามารถเรียกทำงานได้ซึ่งอยู่ในพา ธ การค้นหาที่สามารถเรียกทำงานได้ซึ่งอธิบายโดยPATHตัวแปรสภาพแวดล้อม ไดเรกทอรีปัจจุบันไม่ได้อยู่ในเส้นทางการค้นหาเว้นแต่คุณจะใส่ไว้ที่นั่น ./pyAES.pyดังนั้นการเรียกใช้

ในการเรียกใช้โปรแกรมคุณจะต้องมีสิทธิ์ดำเนินการ:

chmod +x pyAES.py

หากคุณได้รับข้อความเช่น“ ล่ามที่ไม่ดี: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว” หรือเพียง“ ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว” ในไฟล์ที่มีอยู่แสดงว่ามีข้อผิดพลาดในบรรทัดShebangของสคริปต์ (ดู/ bin / sh: ./check-dependencies.pl: ไม่พบ - แต่มี check-dependencies.pl อยู่!สำหรับคำอธิบายโดยละเอียด) บรรทัด shebang เป็นบรรทัดแรกของสคริปต์และระบุตำแหน่งของล่าม .

เพื่อหลีกเลี่ยงการเข้ารหัสเส้นทางที่ยากลำบากไปยังล่าม (เช่น/usr/bin/pythonหรือ/usr/local/bin/python) คุณสามารถใช้/usr/bin/envโปรแกรมเป็นแทรมโพลีน:

#!/usr/bin/env python

PEP 304ระบุว่า#!/usr/bin/env python2เป็นการอ้างอิงถึง Python 2.x ในทันที แต่มีความอุดมสมบูรณ์ของระบบที่มีอยู่ที่หลาม 2.x มีให้เฉพาะภายใต้ชื่อและไม่python python2ดังนั้นคุณอาจจะต้องเล่นปาหี่ระหว่างคนทั้งสอง หากคุณมีสิทธิ์การใช้งานรูทและการแจกจ่ายของคุณมีเพียง Python 2.x ที่ให้pythonหรือให้เท่านั้นให้python2สร้างลิงก์สัญลักษณ์ไปที่ชื่ออื่น

หากคุณเห็นข้อผิดพลาด“: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว” (โดยที่ไม่มีอะไรมาก่อนเครื่องหมายโคลอน) แสดงว่าบรรทัด shebang ของคุณมีการขึ้นบรรทัดใหม่ในตอนท้ายอาจเป็นเพราะมีการแก้ไขภายใต้ Windows ลบ CR: บรรทัด shebang ต้องมีการสิ้นสุดบรรทัด Unix (เฉพาะการป้อนบรรทัดเท่านั้น)


2

ข้อผิดพลาดที่"command not found"คุณได้รับเนื่องจากไฟล์ปฏิบัติการนั้นไม่มีอยู่ใน/bin/หรือ/usr/bin/เส้นทางทั้งหมดใน$PATHตัวแปร

เมื่อคุณรันคำสั่งใด ๆ ในแบ็กเอนด์เชลล์จะค้นหาไฟล์สั่งการ / ไบนารีใน PATH เช่น /bin/ /usr/bin/ฯลฯ ...

ดังนั้นหากเส้นทางไม่ได้กำหนดอย่างถูกต้องแล้วคุณจะประสบปัญหานี้

และเมื่อคุณใช้ " ./command" มันจะดำเนินการคำสั่งนั้นจากไดเร็กตอรี่ปัจจุบันตัวแปร PATH จะไม่ถูกใช้เพื่อค้นหาชื่อไฟล์


ดังนั้นฉันควรจะกำหนดเส้นทางที่สมบูรณ์ของไฟล์ pyAES.py หรือไม่
Sufiyan Ghori

1
ใช่ .. หรือคุณสามารถคัดลอกหรือเชื่อมโยงลังเข้า/usr/bin/
Rahul Patil

ฉันควรจะกำหนดเส้นทางที่สมบูรณ์เมื่อฉันอยู่ในไดเรกทอรีได้อย่างไร
Sufiyan Ghori

2

บรรทัดแรกในไฟล์หลามของคุณควรเป็นดังนี้:

#!/usr/bin/python 

บรรทัดนั้นแสดง linux ที่ล่ามที่จะใช้ หากคุณไม่ทราบเส้นทางไปยัง python ให้พิมพ์:

which python

และเพิ่มเส้นทางไปยังบรรทัดแรก (ตัวอย่าง "#! / PATH") ไฟล์นี้จะต้องปฏิบัติการได้คุณทำได้ด้วย "chmod + x NAME.py" จากนั้นเพิ่มไฟล์ (เพียงแค่คัดลอกหรือสร้าง symlink) ในโฟลเดอร์ที่ระบุไว้ในตัวแปร PATH env ของคุณ (เช่น "/ usr / bin" หรือ "/ usr / local / bin")

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