2011-07-16 40 views
11

Cách tốt nhất để chuyển các biến bash thành tập lệnh python. Tôi muốn làm điều gì đó như sau:Chuyển các biến bash sang tập lệnh?

$cat test.sh 
#!/bin/bash 

foo="hi" 
python -c 'import test; test.printfoo($foo)' 

$cat test.py 
#!/bin/python 

def printfoo(str): 
    print str 

Khi tôi thử chạy các script bash, tôi nhận được một lỗi cú pháp:

File "<string>", line 1 
    import test; test.printfoo($foo) 
          ^
SyntaxError: invalid syntax 

Trả lời

8

Nói tóm lại, các công trình này:

... 
python -c "import test; test.printfoo('$foo')" 
... 

Cập nhật:

Nếu bạn nghĩ rằng chuỗi có thể chứa dấu nháy đơn (') như đã nói bởi @Gordon trong bình luận dưới đây, Bạn có thể thoát khỏi những dấu nháy đơn khá dễ dàng trong bash. Dưới đây là một giải pháp thay thế trong trường hợp đó:

... 
python -c "import test; test.printfoo('"${foo//\'/\\\'}"');" 
... 
+2

Điều này sẽ không thành công nếu $ foo chứa bất kỳ dấu nháy đơn hoặc các ký tự khác python diễn giải bên trong các chữ. @ Adam của giải pháp là mạnh mẽ hơn ... –

2

Bạn phải sử dụng dấu ngoặc kép để có được thay biến trong bash. Tương tự như PHP.

$ foo=bar 
$ echo $foo 
bar 
$ echo "$foo" 
bar 
$ echo '$foo' 
$foo 

Do đó, điều này sẽ làm việc:

python -c "import test; test.printfoo($foo)" 
+0

Điều đó được tiếp tục, nhưng hiện tại có lỗi ở phía bên python, tên của nó là NameError: tên 'hi' không được xác định. – Ravi

2

Làm điều đó với xử lý argv. Bằng cách này bạn không cần phải nhập nó, sau đó chạy nó từ trình thông dịch.

test.py

import sys 

def printfoo(string): 
    print string 

if __name__ in '__main__': 
    printfoo(sys.argv[1]) 

python test.py testingout 
+0

Tôi đã hy vọng gọi printfoo trực tiếp bởi vì tôi có rất nhiều hàm python khác có tham số, mà cần phải được gọi từ bash. Nếu tôi đi qua chính cho tất cả chúng, nó sẽ phức tạp hơn. – Ravi

12

Bạn có thể sử dụng để truy cập os.getenv biến môi trường từ Python:

import os 
import test 
test.printfoo(os.getenv('foo')) 

Tuy nhiên, để cho các biến môi trường được thông qua từ Bash cho bất kỳ quá trình nó tạo ra, bạn cần xuất chúng bằng export builtin:

foo="hi" 
export foo 
# Alternatively, the above can be done in one line like this: 
# export foo="hi" 

python <<EOF 
import os 
import test 
test.printfoo(os.getenv('foo')) 
EOF 

Là một thay thế cho việc sử dụng các biến môi trường, bạn chỉ có thể chuyển các tham số trực tiếp trên dòng lệnh. Bất kỳ tùy chọn truyền cho Python sau -c command được nạp vào sys.argv mảng:

# Pass two arguments 'foo' and 'bar' to Python 
python - foo bar <<EOF 
import sys 
# argv[0] is the name of the program, so ignore it 
print 'Arguments:', ' '.join(sys.argv[1:]) 
# Output is: 
# Arguments: foo bar 
EOF 
Các vấn đề liên quan