Shell Script: เรียกใช้งานโปรแกรมไพ ธ อนจากภายในเชลล์สคริปต์


139

ฉันลอง googling คำตอบ แต่ก็ไม่มีโชค

ฉันต้องใช้เซิร์ฟเวอร์ supercomputer ในการทำงาน แต่เพื่อให้สคริปต์ python ของฉันทำงานได้จะต้องดำเนินการผ่านเชลล์สคริปต์

ตัวอย่างเช่นฉันต้องการที่job.shจะดำเนินการpython_script.py

สิ่งนี้จะสำเร็จได้อย่างไร


2
คุณลองใส่python python_script.pyเชลล์สคริปต์แล้วหรือยัง?
thkala

python python_script.pyอืม หรือเพียงแค่./python_script.pyถ้าสคริปต์มี Shebang

2
@delnan: ./python_script.py ยังต้องการให้สคริปต์สามารถเรียกใช้งานได้
thkala

คุณลองทำในสิ่งใดและปัญหาคืออะไร ไม่ว่าคุณจะไม่ได้ทำสิ่งที่ดีจากการค้นหาของ Google หรือมีจำนวนมากที่คุณไม่ได้บอกเรา ...
thkala

3
นี่เป็นคำถามที่ค่อนข้างเก่า แต่คำตอบที่ดีที่สุด / สมบูรณ์ที่สุดคือคำถามโดยJoãoVíctor ให้แน่ใจว่าได้อ่านมัน
Still.Tony

คำตอบ:


194

เพียงตรวจสอบให้แน่ใจว่าไฟล์ไพ ธ อนทำงานได้ในตัวแปรสภาพแวดล้อม PATH ของคุณจากนั้นเพิ่มสคริปต์ของคุณ

python path/to/the/python_script.py

รายละเอียด:

  • ในไฟล์ job.sh ให้ใส่สิ่งนี้
#!/bin/sh
python python_script.py
  • ดำเนินการคำสั่งนี้เพื่อให้สคริปต์รันได้สำหรับคุณ: chmod u+x job.sh
  • เรียกใช้: ./job.sh

2
ขึ้นอยู่กับระบบของคุณ Python 3 อาจเป็น runtime python เริ่มต้นหรืออาจไม่ใช่ คุณสามารถตรวจสอบโดยการเรียกใช้และคุณสามารถบังคับใช้รุ่นที่มีpython --version python3 hello.py
Jean-Bernard Jansen

จะทำอย่างไรถ้าไม่พบการนำเข้าที่ติดตั้งไว้แล้วเช่นแพนด้า?
mah65

หมายความว่าคุณเปิดตัวไพ ธ อนผิดหรือสภาพแวดล้อมไม่ถูกต้อง ในกรณีนี้คุณควรเติม virtualenv จากนั้นเรียกใช้source PATH/TO/VENV/bin/activateแล้วโทรpython python_script.py
Jean-Bernard Jansen

ฉันพยายามทำสิ่งนี้โดยอัตโนมัติและฉันได้รับข้อผิดพลาด /path/to/Python: can't open file '/path/to/script': [Errno 1] Operation not permittedมีวิธีรวมรหัสหลามของฉันในบรรทัดในสคริปต์ทุบตีหรือไม่
Keyslinger

111

วิธีที่ 1 - สร้างเชลล์สคริปต์:

สมมติว่าคุณมีไฟล์หลามhello.py สร้างไฟล์ชื่อjob.shที่มี

#!/bin/bash
python hello.py

ทำเครื่องหมายว่าปฏิบัติการได้โดยใช้

$ chmod +x job.sh

จากนั้นเรียกใช้

$ ./job.sh

วิธีที่ 2 (ดีกว่า) - ทำให้ไพ ธ อนทำงานจากเชลล์:

แก้ไขสคริปต์ของคุณhello.pyและเพิ่มเป็นบรรทัดแรก

#!/usr/bin/env python

ทำเครื่องหมายว่าปฏิบัติการได้โดยใช้

$ chmod +x hello.py

จากนั้นเรียกใช้

$ ./hello.py

5
โปรดแก้ไขคำตอบของคุณเพื่อให้อ่านง่ายขึ้น คุณสามารถใช้ปุ่ม 101010 ในตัวแก้ไขคำตอบเพื่อทำเครื่องหมายเนื้อหาของสคริปต์เป็นรหัส
thkala

1
#!/usr/bin/env pythonฉันมักจะลืม อย่าลืมตรวจสอบให้แน่ใจว่าคุณกำลังอ้างถึงเส้นทางและเวอร์ชันของไพ ธ อนที่ถูกต้องสำหรับระบบของคุณ!
Still.Tony

10

อิมโฮเขียน

python /path/to/script.py

ค่อนข้างผิดโดยเฉพาะในสมัยนี้ หลามแบบไหน? python2.6? 2.7? 3.0? 3.1? ส่วนใหญ่คุณต้องระบุเวอร์ชันของหลามในแท็ก shebang ของไฟล์ python ฉันขอแนะนำให้ใช้

#! / usr / bin / env python2 # หรือ python2.6 หรือ python3 หรือแม้แต่ python3.1
สำหรับความเข้ากันได้

ในกรณีเช่นนี้ดีกว่ามากที่จะเรียกใช้สคริปต์และเรียกใช้โดยตรง:

#! / bin / ทุบตี

/path/to/script.py

วิธีนี้เวอร์ชันของ python ที่คุณต้องการจะเขียนในไฟล์เดียวเท่านั้น ที่สุดของระบบวันนี้มี python2 และ python3 ในขณะเดียวกันและมันเกิดขึ้นที่ symlink หลามคะแนนเพื่อpython3ในขณะที่คนส่วนใหญ่คาดหวังว่ามันชี้ไปที่python2


1
คุณสามารถส่งพารามิเตอร์แบบเดียวกับpython script.py paramหรือไม่?
คริสเตียน

@kristian ใช่./abc.py -h

7

บันทึกโปรแกรมต่อไปนี้เป็นprint.py:

#!/usr/bin/python3
print('Hello World')

จากนั้นในประเภทอาคาร:

chmod +x print.py
./print.py

4

วิธีนี้ใช้ได้ผลดีที่สุดสำหรับฉัน: เพิ่มที่ด้านบนสุดของสคริปต์:

#!c:/Python27/python.exe

(C: \ Python27 \ python.exe เป็นพา ธ ไปยัง python.exe บนเครื่องของฉัน) จากนั้นเรียกใช้สคริปต์ผ่านทาง:

chmod +x script-name.py && script-name.py

เพียงชี้แจงนี้เป็นเฉพาะ Windows และพรอมต์ที่ฉันใช้คือทุบตี Git ฉันคิดว่ามันมีประโยชน์มาก โดยเฉพาะอย่างยิ่งในสภาพแวดล้อมของ Windows
PeterB

4

สิ่งนี้ใช้ได้กับฉัน:

  1. สร้างงานเชลล์ไฟล์ใหม่ ดังนั้นสมมติว่า: touch job.shและเพิ่มคำสั่งเพื่อเรียกใช้สคริปต์ไพ ธ อน (คุณสามารถเพิ่มอาร์กิวเมนต์บรรทัดคำสั่งในไพ ธ อนนั้นฉันมักจะกำหนดอาร์กิวเมนต์บรรทัดคำสั่งของฉันไว้ล่วงหน้า)

    chmod +x job.sh

  2. ภายในjob.shเพิ่มไฟล์ py ต่อไปนี้สมมติว่า:

    python_file.py argument1 argument2 argument3 >> testpy-output.txt && echo "Done with python_file.py"

    python_file1.py argument1 argument2 argument3 >> testpy-output.txt && echo "Done with python_file1.py"

ผลลัพธ์ของ job.sh ควรมีลักษณะเช่นนี้:

Done with python_file.py

Done with python_file1.py

ฉันมักใช้สิ่งนี้เมื่อฉันต้องเรียกใช้ไฟล์หลามหลาย ๆ ไฟล์ที่มีอาร์กิวเมนต์ต่างกันที่กำหนดไว้ล่วงหน้า

หมายเหตุ:เพียงแค่มุ่งหน้าอย่างรวดเร็วถึงสิ่งที่เกิดขึ้นที่นี่:

python_file.py argument1 argument2 argument3 >> testpy-output.txt && echo "completed with python_file.py" . 

  • ที่นี่เชลล์สคริปต์จะเรียกใช้ไฟล์python_file.pyและเพิ่มอาร์กิวเมนต์บรรทัดคำสั่งหลายรายการณ เวลารันไทม์ลงในไฟล์ python
  • สิ่งนี้ไม่ได้หมายความว่าคุณจะต้องผ่านอาร์กิวเมนต์บรรทัดคำสั่งด้วย
  • คุณสามารถใช้มันเหมือน: python python_file.pyธรรมดาและเรียบง่าย ขึ้นไปข้างบน>>จะพิมพ์และเก็บเอาท์พุทของไฟล์. py นี้ในไฟล์ testpy-output.txt
  • &&เป็นตัวดำเนินการแบบลอจิคัลที่จะทำงานหลังจากดำเนินการตามข้างต้นได้สำเร็จและechoตัวเลือก"เสร็จสิ้นด้วย python_file.py" จะถูกสะท้อนไปยัง cli / เทอร์มินัลของคุณในขณะใช้งาน

4

คุณควรจะเรียกมันได้python scriptname.pyเช่น

# !/bin/bash

python /home/user/scriptname.py 

ตรวจสอบให้แน่ใจด้วยว่าสคริปต์มีสิทธิ์ใช้งาน

chmod u+x scriptname.pyคุณสามารถทำให้มันปฏิบัติการโดยใช้



1

เนื่องจากโพสต์อื่น ๆ พูดทุกอย่าง (และฉันสะดุดกับโพสต์นี้ในขณะที่มองหาสิ่งต่อไปนี้)
นี่คือวิธีการเรียกใช้งานสคริปต์ python จากสคริปต์ python อื่น:

Python 2:

execfile("somefile.py", global_vars, local_vars)

Python 3:

with open("somefile.py") as f:
    code = compile(f.read(), "somefile.py", 'exec')
    exec(code, global_vars, local_vars)

และคุณสามารถจัดหา args โดยการให้บริการอื่น ๆ sys.argv

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