2012-07-09 146 views
5

我写了一个Python模块,其中包含返回数组的函数。我希望能够访问从python模块返回的字符串数组,并在bash脚本中进行迭代,以便遍历数组元素。将python数组传递给bash脚本(并将bash变量传递给python函数)

例如:

Python模块(mymod)

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

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

bash脚本

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 

我怎么能在bash实现这个?

版本信息:

的Python 2.6.5 庆典:4.1.5

+0

让脚本进出脚本的最简单方法可能是通过stdin/stdout。 – 2012-07-09 09:11:39

回答

13

第二个尝试 - 这一次壳采用整合首当其冲。

鉴于foo.py包含此:

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

然后写出如下您的bash脚本:

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

的其余部分是从Python端驱动整合的第一个答案。

的Python

import os 
import subprocess 

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

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

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

庆典

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

感谢您的反馈。我希望我的Python模块不知道是谁/叫什么(关注点分离) - 您建议的代码需要修改python代码 - 这并不理想。 – 2012-07-09 09:26:13

+0

@HomunculusReticulli好的 - 希望我现在明白了 - 新代码使用shell来驱动集成。 – 2012-07-09 09:33:10

+0

是的! - 这直观上有道理!非常感谢!。刚刚尝试过它,它的工作原理:) – 2012-07-09 10:14:08

0

代替的类似对象序列化,或许是一个办法是从命令打印逗号分隔值和管它们的列表线。

然后,你可以这样做:

> python script.py | sh shellscript.sh 
1

此外,你可以告诉Python进程能够读取标准输入“ - ”作为

echo "print 'test'" | python - 

现在,您可以定义的Python代码multiline snippets并将它们传递到subshel​​l中

FOO=$(python - <<PYTHON 

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

print ' '.join(foo()) 

PYTHON 
) 

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

您还可以使用环境设置列出/传递环境和本地变量从bash到python(到“..”字符串)。

+0

谢谢,这对我非常有帮助。 – Perlnika 2014-03-05 18:37:09