7

我编写了一个 Python 模块,其中包含返回数组的函数。我希望能够访问从 python 模块返回的字符串数组,并在 bash 脚本中进行迭代,所以我可以迭代数组元素。

例如:

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

4

5 回答 5

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')

重击

#!/bin/bash
for x in $FOO
do
        echo "This is foo.sh: $x"
done
于 2012-07-09T09:21:08.627 回答
1

此外,您可以告诉 python 进程用“-”读取 STDIN,如

echo "print 'test'" | python -

现在您可以定义多行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 列出/传递环境和局部变量(到“..”字符串)。

于 2013-03-04T00:14:37.860 回答
0

In lieu of something like object serialization, perhaps one way is to print a list of comma separated values and pipe them from the command line.

Then you can do something like:

> python script.py | sh shellscript.sh
于 2012-07-09T09:30:57.390 回答
0

以及 Maria 的从 python 获取输出的方法,您可以使用该argparse库从 bash 将变量输入到 python 脚本;这里有 python 3的教程和更多文档,这里有 python 2 的教程和更多文档。

一个示例 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]
于 2019-05-03T20:00:13.303 回答
0

这也有帮助。脚本.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

于 2018-08-03T20:21:13.813 回答