在Python中嵌入Bash脚本,不使用subprocess调用
我之前用过 subprocess 这个模块,可以把 bash 脚本嵌入到 Python 代码里。今天我在看一段 Python 代码时,偶然发现了下面这行代码,它也是把 bash 脚本嵌入到 Python 中,不过是用一种类似于 docstring
的方式。
#!/bin/bash -
''''echo -n
if [[ $0 == "file" ]]; then
..
fi
'''
有没有人能解释一下这种方法?这种方法叫什么?它有什么好处?我能明显看出它简单,但我觉得其中还有更多的东西。
2 个回答
3
- 不,这个不是嵌入在Python里的,开头的那行说明这是一个bash脚本。
''''
其实就是两个''
,也就是一个空字符串,没有任何作用。'''
是无效的,因为最后一个'
没有关闭。
6
这是一种比较聪明的方法,可以让一个文件同时成为有效的Python脚本和有效的bash脚本。需要注意的是,这并不会神奇地产生一个子进程。实际上,如果这个文件被bash执行,bash脚本会被运行;而如果被Python执行,bash脚本就会被忽略。
虽然这个方法很聪明,但一般来说,这并不是一个好的软件工程实践。通常,分开写两个脚本会更合理。
举个更具体的例子(假设这个文件叫做"polyglot"):
''''echo hello from bash
exit
'''
print('hello from python')
正如你所提到的,bash会忽略开头的引号,打印出“hello from bash”,然后在到达三重引号之前就退出了。而Python会把bash脚本当作一个字符串来处理,忽略它,继续运行下面的Python脚本。
$ python polyglot
hello from python
$ bash polyglot
hello from bash
但通常来说,这种情况可以更清晰地重构成两个脚本,各自用一种语言。