2011-12-19 68 views
11

Tôi đang cố gắng tìm ra cách gọi hàm Python từ tập lệnh shell.Gọi hàm Python từ tập lệnh shell

Tôi có một tệp Python với nhiều hàm và tôi cần phải sử dụng các giá trị được trả lại bởi chúng trong tập lệnh trình bao của tôi. Có cách nào để làm điều đó.

Tôi đang thực hiện việc này để đọc tệp cấu hình bằng Python và nhận các giá trị trong trình bao. Có cách nào khác tốt hơn để đạt được điều này không.

test.py chứa:

import ConfigParser 

config = ConfigParser.ConfigParser() 
config.read("test.conf") 

def get_foo(): 
    return config.get("locations", "foo") 

def get_bar(): 
    return config.get("locations", "bar") 

tôi cần để lưu trữ các giá trị được trả về bởi các chức năng Python trong một biến vỏ.

+3

Vấn đề lớn hơn bạn đang cố gắng giải quyết là gì? Tại sao không sử dụng kịch bản với cấu hình làm công việc của kịch bản lệnh shell? Ngoài ra, tại sao không đọc cấu hình từ trình bao? Tôi cho rằng vấn đề là phức tạp, đủ để chia thành hai tập tin. –

Trả lời

22

Bạn có thể gửi kết quả của chức năng của mình vào đầu ra tiêu chuẩn bằng cách yêu cầu thông dịch Python để in kết quả:

python -c 'import test; print test.get_foo()' 

Tùy chọn -c chỉ đơn giản là yêu cầu Python để thực hiện một số lệnh Python.

Để lưu trữ các kết quả trong một biến, bạn do đó có thể làm:

RESULT_FOO=`python -c 'import test; print test.get_foo()'` 

hoặc tương đương

RESULT=$(python -c 'import test; print test.get_foo()') 

từ backticks và $(…) đánh giá một lệnh và thay thế nó bằng sản lượng của nó.

PS: Bắt kết quả của mỗi hàm yêu cầu phân tích cú pháp tệp cấu hình mỗi lần, với cách tiếp cận này. Điều này có thể được tối ưu hóa bằng cách trả lại tất cả các kết quả trong một đi, với một cái gì đó như:

ALL_RESULTS=$(python -c 'import test; print test.get_foo(), test.get_bar()') 

Kết quả sau đó có thể được chia và đặt trong các biến khác nhau với

RESULT_BAR=$(echo $ALL_RESULTS | cut -d' ' -f2) 

mà mất thứ hai kết quả và đặt nó trong ví dụ RESULT_BAR (và tương tự: -fn cho kết quả #n).

PPS: Như Pablo Maurin đã đề cập, nó có lẽ sẽ dễ dàng hơn để làm mọi thứ trong một thông dịch viên duy nhất (Python, nhưng có lẽ cũng là vỏ), nếu có thể, thay vì tính toán các biến trong một chương trình và sử dụng chúng trong một một.

+0

hoặc thử gửi đầu ra tới tập lệnh python khác và chạy tập lệnh đó. – sum2000

+0

trông đẹp .. nó đã làm việc .. tôi đã tự hỏi. trong trường hợp này .. để đọc tham số n từ tập tin cấu hình tôi cần phải gọi n lần dòng trên từ vỏ mà sẽ kết thúc đọc rất nhiều lần trong python bằng cách sử dụng configparser. là bất kỳ cách nào tốt hơn tôi có thể làm gì? –

+1

@saddy: Ví dụ: bạn có thể in cả hai kết quả lại với nhau, sau đó sử dụng các tiện ích Unix để tách chúng: 'RESULT = $ (kiểm tra nhập khẩu; print test.get_foo(), test.get_bar())', và sau đó sử dụng 'cut ',' sed' (?), hoặc 'awk' (?) để trích xuất từng phần của kết quả lần lượt: 'RESULT2 = $ (echo $ RESULT | cut -d '' -f 2)' cung cấp cho bạn 'get_bar()', v.v. – EOL

Các vấn đề liên quan