如何避免从Bash脚本多次调用Python解释器?

时间:2017-03-09 04:15:57

标签: python bash language-interoperability

我正在开发一个涉及两个主要组件的项目,一个带有Bash命令行界面,另一个带有Python API。出于此问题的目的,假设这两个组件都不能被修改为使用不同的语言进行接口。

我现在需要编写一些使用这两个组件功能的脚本。我有两种可能的方法:(a)编写调用Python解释器的Bash脚本以与Python组件连接,或者(b)使用调用os.system或类似的东西编写Python脚本,这样就可以运行Bash命令。

编写Bash脚本的问题是我经常需要在循环中调用Python组件中的函数,如下所示:

while read -r line ; do
    echo "Now handling the next line of the file."
    python -c "from my_module import *; my_function('${line}')"
    # some bash commands
done < some_file.txt

我不喜欢这么多次调用Python解释器的开销,而且经常这样做同样的导入。有没有办法启动解释器并导入模块一次,然后动态调用该上下文中的其他函数?请记住,我将在Python函数调用之间使用其他Bash命令。

编写Python脚本的问题是,只要我们需要使用命令行界面访问组件,我们就必须使用os.system或类似的调用。有些脚本只包含对命令行界面的调用,这意味着我将使用os.system的每一行都有一个Python脚本。我也不喜欢这样。

这些脚本,无论是用Python还是Bash编写,都将用于单元测试,因此可读性,可维护性和可扩展性优先于纯速度。此外,为了一致性,所有这些都应该用相同的语言编写。

我希望有人能引导我找到解决这个问题的最优雅方案。提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以在bash

中执行此操作
mkfifo in out
python -ic 'from my_module import *'  <in >out & exec 3> in 4< out
while read -r line ; do
    echo "Now handling the next line of the file."
    echo "my_function('$line')" >&3
    # read the result of my_function
    read r <&4; echo $r
    # some bash commands
done < some_file.txt
exec 3>&-
exec 4<&-
rm in out

您可以在继续执行python命令的同时向bash发送命令。