在Python中嵌入Bash脚本,不使用subprocess调用

3 投票
2 回答
919 浏览
提问于 2025-04-17 17:47

我之前用过 subprocess 这个模块,可以把 bash 脚本嵌入到 Python 代码里。今天我在看一段 Python 代码时,偶然发现了下面这行代码,它也是把 bash 脚本嵌入到 Python 中,不过是用一种类似于 docstring 的方式。

#!/bin/bash -

''''echo -n
if [[ $0 == "file" ]]; then
  ..
fi
'''

有没有人能解释一下这种方法?这种方法叫什么?它有什么好处?我能明显看出它简单,但我觉得其中还有更多的东西。

2 个回答

3
  1. 不,这个不是嵌入在Python里的,开头的那行说明这是一个bash脚本。
  2. ''''其实就是两个'',也就是一个空字符串,没有任何作用。
  3. '''是无效的,因为最后一个'没有关闭。
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

但通常来说,这种情况可以更清晰地重构成两个脚本,各自用一种语言。

撰写回答