2017-03-09 73 views
2

我正在研究一个涉及两个主要组件的项目,一个使用Bash命令行界面,另一个使用Python API。为了这个问题的目的,假定这些组件都不能被修改为使用不同的界面语言。如何避免从Bash脚本多次调用Python解释器?

我现在需要编写一些使用这两个组件的功能的脚本。我有两种可能的方法:(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编写,都会用于单元测试,因此可读性,可维护性和可扩展性比纯速度更高。此外,为了一致性,所有这些应该用相同的语言编写。

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

+0

python repl?发送stdin到repl? –

+0

@AlexanderMills我希望能够做到这样的事情,但我之前没有看到有名的管道。迭戈的回答告诉我如何做到这一点。还是)感谢你的建议! – jdw1996

回答

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命令。

+0

这正是我所希望的!谢谢! – jdw1996