2012-07-09 52 views
5

Tôi đã viết một mô-đun Python có chứa các hàm trả về mảng. Tôi muốn có thể truy cập các mảng chuỗi được trả về từ mô-đun python và lặp lại trong một tập lệnh bash, vì vậy tôi có thể lặp qua các phần tử mảng.Chuyển mảng python sang bash script (và chuyển biến bash sang hàm python)

Ví dụ:

mô-đun Python (mymod)

def foo(): 
    return ('String', 'Tuple', 'From', 'Python') 

def foo1(numargs): 
    return [x for x in range(numargs)] 

Bash script

foo_array = .... # obtain array from mymod.foo() 
for i in "${foo_array[@]}" 
do 
    echo $i 
done 


foo1_array = .... # obtain array from mymod.foo1(pass arg count from bash) 
for j in "${foo1_array[@]}" 
do 
    echo $j 
done 

Làm thế nào tôi có thể thực hiện điều này trong bash ?.

phiên bản Thông tin:

Python 2.6.5 bash: 4.1.5

+0

Cách dễ nhất để đưa mọi thứ vào và ra khỏi tập lệnh có thể là thông qua stdin/stdout. –

Trả lời

13

Second try - vỏ thời gian này có gánh nặng hội nhập.

Với foo.py chứa này:

def foo(): 
     foo = ('String', 'Tuple', 'From', 'Python') 
     return foo 

Sau đó viết kịch bản bash của bạn như sau:

#!/bin/bash 
FOO=`python -c 'from foo import *; print " ".join(foo())'` 
for x in $FOO: 
do 
     echo "This is foo.sh: $x" 
done 

Phần còn lại là câu trả lời đầu tiên mà các ổ đĩa tích hợp từ cuối Python.

Python

import os 
import subprocess 

foo = ('String', 'Tuple', 'From', 'Python') 

os.putenv('FOO', ' '.join(foo)) 

subprocess.call('./foo.sh') 

bash

#!/bin/bash 
for x in $FOO 
do 
     echo "This is foo.sh: $x" 
done 
+0

Cảm ơn phản hồi. Tôi muốn mô-đun Python của tôi là bất khả tri của ai/những gì được gọi nó (tách mối quan tâm) - mã bạn đề nghị đòi hỏi phải sửa đổi mã python - đó không phải là lý tưởng. –

+0

@HomunculusReticulli OK - hy vọng tôi đã hiểu nó ngay bây giờ - mã mới sử dụng trình bao để thúc đẩy tích hợp. –

+0

CÓ! - điều đó có ý nghĩa trực quan !. Cảm ơn rất nhiều!. Chỉ cần thử nó và nó hoạt động :) –

0

Thay một cái gì đó giống như đối tượng serialization, có lẽ một trong những cách là in một danh sách các giá trị dấu phẩy tách ra và ống chúng từ lệnh hàng.

Sau đó, bạn có thể làm điều gì đó như:

> python script.py | sh shellscript.sh 
1

Bên cạnh đó, bạn có thể nói quá trình python để đọc STDIN với "-" như trong

echo "print 'test'" | python - 

Bây giờ bạn có thể định nghĩa multiline snippets mã python và chuyển chúng vào subshell

FOO=$(python - <<PYTHON 

def foo(): 
    return ('String', 'Tuple', 'From', 'Python') 

print ' '.join(foo()) 

PYTHON 
) 

for x in $FOO 
do 
    echo "$x" 
done 

Bạn cũng có thể sử dụng envđặt để liệt kê/chuyển môi trường và biến cục bộ từ bash sang python (thành chuỗi "..").

+0

Cảm ơn, điều này cực kỳ hữu ích cho tôi. – Perlnika

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