在Python中嵌入Bash脚本而不使用子进程调用

Bit*_*map 3 python bash

我已经能够使用subprocess将 bash 脚本嵌入到 python 中。我今天碰巧浏览 python 代码,偶然发现了下面这行代码,它也将 bash 脚本嵌入到 python 中 - 使用类似于docstring.

#!/bin/bash -

''''echo -n
if [[ $0 == "file" ]]; then
  ..
fi
'''
Run Code Online (Sandbox Code Playgroud)

有人可以阐明这种方法吗?这种方法叫什么,也许还有相关的好处。我显然可以看到简单性,但我认为还有更多的内容。

Jer*_*man 6

这是使该文件既是有效的 Python 脚本又是有效的 bash 脚本的巧妙方法。请注意,它不会导致子进程神奇地产生。相反,如果文件由 bash 计算,则 bash 脚本将运行,如果由 Python 计算,则 bash 脚本将被忽略。

这很聪明,但一般来说可能不是一个好的软件工程实践。拥有单独的脚本通常更有意义。

举一个更具体的例子(假设这个文件被称为“ polyglot ”):

''''echo hello from bash
exit
'''

print('hello from python')
Run Code Online (Sandbox Code Playgroud)

正如您所注意到的,bash 将忽略最初的引号,并打印“hello from bash”,然后在到达三重引号之前退出。Python 会将 bash 脚本视为字符串,并忽略它,运行下面的 Python 脚本。

$ python polyglot
hello from python
$ bash polyglot
hello from bash
Run Code Online (Sandbox Code Playgroud)

但自然地,这通常可以(并且更清楚地)重构为两个脚本,每种语言一个。