我编写了一个Python模块,其中包含返回数组的函数。我希望能够访问从python模块返回的字符串数组,并在bash脚本中迭代,所以我可以迭代数组元素。
例如:
def foo():
return ('String', 'Tuple', 'From', 'Python' )
def foo1(numargs):
return [x for x in range(numargs)]
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 bash:4.1.5
答案 0 :(得分:13)
第二次尝试 - 这次shell将整合首当其冲。
鉴于 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')
的bash
#!/bin/bash
for x in $FOO
do
echo "This is foo.sh: $x"
done
答案 1 :(得分:1)
此外,您可以告诉python进程使用“ - ”读取STDIN,如
echo "print 'test'" | python -
现在您可以定义multiline snippets的python代码并将它们传递给子shell
FOO=$( python - <<PYTHON
def foo():
return ('String', 'Tuple', 'From', 'Python')
print ' '.join(foo())
PYTHON
)
for x in $FOO
do
echo "$x"
done
您还可以使用 env 和设置列出/传递从bash到python的环境和局部变量(转换为“..”字符串)。
答案 2 :(得分:0)
代替对象序列化之类的东西,也许一种方法是打印逗号分隔值列表并从命令行管道它们。
然后你可以做类似的事情:
> python script.py | sh shellscript.sh
答案 3 :(得分:0)
这也有帮助。 script.py:
a = ['String','Tuple','From','Python']
for i in range(len(a)):
print(a[i])
然后我们创建以下bash脚本pyth.sh
#!/bin/bash
python script.py > tempfile.txt
readarray a < tempfile.txt
rm tempfile.txt
for j in "${a[@]}"
do
echo $j
done
sh pyth.sh
答案 4 :(得分:0)
与Maria的从python获取输出的方法一样,您可以使用argparse
库从bash向python脚本输入变量;有适用于python 3的教程和更多文档here和适用于python 2的here。
示例python脚本command_line.py
:
import argparse
import numpy as np
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('x', type=int)
parser.add_argument('array')
args = parser.parse_args()
print(type(args.x))
print(type(args.array))
print(2 * args.x)
str_array = args.array.split(',')
print(args.x * np.array(str_array, dtype=int))
然后,从终端:
$ python3 command_line.py 2 0,1,2,3,4
# Output
<class 'int'>
<class 'str'>
4
[0 2 4 6 8]