เรียกสคริปต์ Python จาก bash พร้อมอาร์กิวเมนต์


95

ฉันรู้ว่าฉันสามารถเรียกใช้สคริปต์ python จากสคริปต์ทุบตีของฉันโดยใช้สิ่งต่อไปนี้:

python python_script.py

แต่ถ้าฉันต้องการส่งผ่านตัวแปร / อาร์กิวเมนต์ไปยังสคริปต์ python จากสคริปต์ทุบตีของฉัน ฉันจะทำเช่นนั้นได้อย่างไร?

โดยทั่วไป bash จะใช้ชื่อไฟล์จากนั้น python จะอัปโหลด แต่ฉันต้องส่งชื่อไฟล์จาก bash เป็น python เมื่อฉันเรียกมัน


เมื่อดำเนินการpython python_script.pyในเชลล์เริ่มต้นของคุณใน Debian คุณกำลังใช้ bash อยู่แล้ว ... ดังนั้นเพียงแค่ทำในสคริปต์ทุบตีของคุณ:python python_script.py arg1 arg2 ...
Oz123

@Jimmy Unprepared Question ฉันคิดว่ามันง่ายมาก Link: tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan

คำตอบ:


140

ในการรันสคริปต์ python ใน bash script คุณต้องเรียกใช้คำสั่งเดียวกับที่คุณทำภายในเทอร์มินัล ตัวอย่างเช่น

> python python_script.py var1 var2

ในการเข้าถึงตัวแปรเหล่านี้ภายใน python คุณจะต้อง

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2

ขอบคุณ. อย่างไรก็ตามวิธีนี้จะ จำกัด ไฟล์ python สำหรับกรณีการใช้งานเดียวเท่านั้น มีวิธีเรียก method ของไฟล์ python ที่มีพารามิเตอร์แบบไดนามิกภายใน bash scripts หรือไม่? ด้วยวิธีนี้เราจะสามารถใช้ไฟล์ python เดียวกันได้ ฉันพยายามทำสิ่งนี้ด้วยวิธีการเรียกไฟล์ python ด้วย $ var ภายใน bash script แต่มันล้มเหลวอย่างใด
burcak

@burcak หากคุณต้องการเรียกใช้ไฟล์ python แบบขนานตามพารามิเตอร์ไดนามิกขั้นแรกให้สร้างพา ธ ที่สมบูรณ์ << พา ธ ตำแหน่งสคริปต์ python >> / << ชื่อสคริปต์ python >> param1 param2 | << พา ธ ตำแหน่งสคริปต์ python >> / << ชื่อสคริปต์ python >> param3 param4 ในสคริปต์ bash จากนั้นส่งเอาต์พุตเป็นอาร์กิวเมนต์ไปยังสคริปต์ python ด้านล่าง import sys import subprocess arg_str = "" .join (sys.argv [1:]) cmds = arg_str. แยก ('|') สำหรับ cmd ใน cmds: print ('call -' + cmd) subprocess.Popen (cmd, shell = True) print ('call cmds finished')
Thiru

22

ใช้

python python_script.py filename

และในสคริปต์ Python ของคุณ

import sys
print sys.argv[1]

21

นอกจากsys.argvนี้ยังดูที่โมดูลอาร์กิวเมนต์ซึ่งช่วยกำหนดอ็อพชันและอาร์กิวเมนต์สำหรับสคริปต์

โมดูล argparse ทำให้ง่ายต่อการเขียนอินเตอร์เฟสบรรทัดคำสั่งที่ใช้งานง่าย


ฉันเห็นด้วยสำหรับฉันแล้ว argparse เป็นตัวเลือกที่ดีกว่า sys.argv
Mo Ali

9

ตัวเลือกที่ฝังตัว:

ตัดรหัส python ในฟังก์ชัน bash

#!/bin/bash

function current_datetime {
python - <<END
import datetime
print datetime.datetime.now()
END
}

# Call it
current_datetime

# Call it and capture the output
DT=$(current_datetime)
echo Current date and time: $DT

ใช้ตัวแปรสภาพแวดล้อมเพื่อส่งผ่านข้อมูลไปยังสคริปต์ Python ที่ฝังไว้

#!/bin/bash

function line {
PYTHON_ARG="$1" python - <<END
import os
line_len = int(os.environ['PYTHON_ARG'])
print '-' * line_len
END
}

# Do it one way
line 80

# Do it another way
echo $(line 80)

http://bhfsteve.blogspot.se/2014/07/embedding-python-in-bash-scripts.html


1

ใช้ในสคริปต์:

echo $(python python_script.py arg1 arg2) > /dev/null

หรือ

python python_script.py "string arg"  > /dev/null

สคริปต์จะดำเนินการโดยไม่มีเอาต์พุต


เป็นไปได้ที่จะแทนที่ "string arg" ด้วยตัวแปรที่มาจาก bash?
CodeGuru

1

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

pythonprog.py "$argument"& # การ & ส่งคืนการควบคุมตรงไปยังสคริปต์ทุบตีดังนั้นจึงต้องอยู่นอกแบ็กติก ตัวอย่างของข้อความนี้แสดงโดยไม่มี "` "ทั้งสองข้างของคำสั่งด้วยเหตุผลบางประการ

ตราบใดที่สคริปต์ python จะรันจาก cli ตามชื่อแทนที่จะใช้ python pythonprog.py สิ่งนี้ใช้ได้ภายในสคริปต์ หากคุณต้องการมากกว่าหนึ่งอาร์กิวเมนต์ให้ใช้ช่องว่างระหว่างแต่ละอาร์กิวเมนต์ภายในเครื่องหมายคำพูด


0

พิมพ์ args ทั้งหมดโดยไม่มีชื่อไฟล์:

for i in range(1, len(sys.argv)):
print(sys.argv[i])

-1

และดูที่โมดูลgetopt มันใช้ได้ดีสำหรับฉัน!


เริ่มต้นเอกสาร getopt : หมายเหตุ:โมดูล getopt เป็นตัวแยกวิเคราะห์สำหรับตัวเลือกบรรทัดคำสั่งซึ่ง API ได้รับการออกแบบมาให้คุ้นเคยกับผู้ใช้ฟังก์ชัน C getopt () ผู้ใช้ที่ไม่คุ้นเคยกับฟังก์ชัน C getopt () หรือผู้ที่ต้องการเขียนโค้ดน้อยลงและได้รับความช่วยเหลือและข้อความแสดงข้อผิดพลาดที่ดีขึ้นควรพิจารณาใช้โมดูล argparse แทน
cate
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.