我如何知道我的 Python 脚本是否已通过命令行解释器调用或作为可执行文件(通过 shebang)调用?

我如何知道我的 Python 脚本是否已通过命令行解释器调用或作为可执行文件(通过 shebang)调用?

Python 脚本中有没有办法确定调用者是否在命令行上提供了解释器,或者是否使用 shebang 行来确定要使用的解释器?

举个简单的例子,myscript.py(具有可执行权限):

#!/bin/env python
import sys
print sys.argv

我想知道这个脚本是否被称为:

$ python myscript.py

或者

$ ./myscript.py

无论哪种情况,sys.argv[0] 都只是“myscript.py”。

答案1

这可以通过使用通过 shebang 行(间接)设置的环境变量来实现。

理论上,可以在 shell 中设置相同的变量,但除非有人试图明确欺骗检测机制,否则这应该没问题。

不幸的是,shebang 行仅限于两个参数,这还不够(至少我不知道这样的解决方案)。因此您需要一个帮助脚本。幸运的是,Linux 内核不要求 shebang 解释器是二进制文件:

/usr/local/bin/shebang-bash.sh

#! /bin/bash
via_shebang=1 bash "$1"

然后你使用该脚本作为 shebang 解释器:

#! /usr/local/bin/shebang-bash.sh

在脚本中,您只需检查 的值/存在$via_shebang

相关内容