我正在开发一个涉及两个主要组件的项目,一个带有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编写,都将用于单元测试,因此可读性,可维护性和可扩展性优先于纯速度。此外,为了一致性,所有这些都应该用相同的语言编写。
我希望有人能引导我找到解决这个问题的最优雅方案。提前谢谢!
答案 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
发送命令。