Gọi tập lệnh Python từ bash với đối số


91

Tôi biết rằng tôi có thể chạy một tập lệnh python từ tập lệnh bash của mình bằng cách sử dụng như sau:

python python_script.py

Nhưng điều gì xảy ra nếu tôi muốn truyền một biến / đối số cho tập lệnh python từ tập lệnh bash của mình. Làm thế nào tôi có thể làm điều đó?

Về cơ bản bash sẽ tạo ra một tên tệp và sau đó python sẽ tải nó lên, nhưng tôi cần phải gửi tên tệp từ bash sang python khi tôi gọi nó.


khi thực hiện python python_script.pytrong vỏ mặc định của bạn trong Debian bạn đang sử dụng bash đã ... vì vậy chỉ cần làm trong kịch bản bash của bạn:python python_script.py arg1 arg2 ...
Oz123

@Jimmy Câu hỏi chưa chuẩn bị Tôi nghĩ, nó rất dễ Link: tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan

Câu trả lời:


132

Để thực thi một tập lệnh python trong một tập lệnh bash, bạn cần gọi cùng một lệnh mà bạn sẽ thực hiện trong một thiết bị đầu cuối. Ví dụ

> python python_script.py var1 var2

Để truy cập các biến này trong python, bạn sẽ cần

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

Cảm ơn. Tuy nhiên, cách này hạn chế tệp python chỉ cho một trường hợp sử dụng. Có cách nào để gọi các phương thức của tệp python với các tham số động trong tập lệnh bash không? Bằng cách này, chúng tôi sẽ có thể sử dụng cùng một tệp python. Tôi đã cố gắng thực hiện việc này với các cuộc gọi phương thức tệp python với $ var trong tập lệnh bash. Nhưng bằng cách nào đó nó đã thất bại.
burcak

@burcak Nếu bạn muốn thực thi tệp python song song dựa trên các tham số động, Đầu tiên hãy xây dựng đường dẫn hoàn chỉnh << đường dẫn vị trí tập lệnh python >> / << tên tập lệnh python >> param1 param2 | << đường dẫn vị trí tập lệnh python >> / << tên tập lệnh python >> param3 param4 trong tập lệnh bash, sau đó chuyển đầu ra làm đối số cho tập lệnh python bên dưới, nhập sys import subprocess arg_str = "" .join (sys.argv [1:]) cmds = arg_str. split ( '|') cho cmd trong cmds: print ( 'cuộc gọi -' + cmd) subprocess.Popen (cmd, vỏ = True) in ( 'cmds gọi xong')
Thiru

21

Sử dụng

python python_script.py filename

và trong tập lệnh Python của bạn

import sys
print sys.argv[1]

21

Ngoài ra sys.argv, hãy xem mô-đun argparse , giúp xác định các tùy chọn và đối số cho các tập lệnh.

Mô-đun argparse giúp dễ dàng viết các giao diện dòng lệnh thân thiện với người dùng.


Tôi đồng ý, đối với tôi thì argparse là một lựa chọn tốt hơn nhiều so với sys.argv
Mo Ali

8

Tùy chọn nhúng:

Gói mã python trong một hàm 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

Sử dụng các biến môi trường để chuyển dữ liệu vào tập lệnh python được nhúng của bạn.

#!/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

sử dụng trong script:

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

hoặc là

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

Tập lệnh sẽ được thực thi mà không có đầu ra.


Có thể thay thế "string arg" bằng một biến từ bash không?
CodeGuru

1

Tôi có một tập lệnh bash gọi một quy trình python nhỏ để hiển thị một cửa sổ thông báo. Vì tôi cần sử dụng killall để dừng tập lệnh python, tôi không thể sử dụng phương pháp trên vì nó có nghĩa là chạy killall python có thể loại bỏ các chương trình python khác nên tôi sử dụng

pythonprog.py "$argument"& # Điều khiển & trả về thẳng đến tập lệnh bash vì vậy phải nằm ngoài dấu gạch ngược. Bản xem trước của thông báo này đang hiển thị nó mà không có "` "ở cả hai bên của lệnh vì một số lý do.

Miễn là tập lệnh python sẽ chạy từ cli theo tên thay vì python pythonprog.py thì điều này sẽ hoạt động trong tập lệnh. Nếu bạn cần nhiều đối số, chỉ cần sử dụng khoảng trắng giữa mỗi đối số trong dấu ngoặc kép.


-1

và xem qua mô-đun getopt . Nó hoạt động khá tốt cho tôi!


tài liệu getopt bắt đầu: Lưu ý: Mô-đun getopt là trình phân tích cú pháp cho các tùy chọn dòng lệnh có API được thiết kế để quen thuộc với người dùng hàm C getopt (). Những người dùng không quen với hàm C getopt () hoặc muốn viết ít mã hơn và nhận trợ giúp tốt hơn và thông báo lỗi nên xem xét sử dụng mô-đun argparse thay thế.
cate
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.