0

我有一个用 Python 编写的简单脚本解释器,它处理用文本文件编写的脚本。我可以使用脚本顶部的 shebang 来引用解释器,这样我就可以直接执行脚本。

解释器有一些逻辑来检测何时通过 shebang 调用它,以便它可以调整参数列表以进行补偿。这是必要的,因为当直接调用时,每个参数都是 argv 中的一个单独项,但是,当通过 shebang 调用时,shebang 行上的所有参数都包含在第一个参数字符串中,脚本的名称在第二个参数字符串中之后直接给脚本的任何参数。

我检查shebang的方式如下:

def main(name, argv):

    ...

    if len(argv) >= 2 and name[0] == '/' and os.path.isfile(argv[1]) and os.access(argv[1], os.X_OK):
        input = open(argv[1])
        arglist = argv[0].split() + argv[2:]
    else:
        arglist = argv
        input = sys.stdin

    ...

sys.exit(main(sys.argv[0], sys.argv[1:]))

如果至少有 2 个 argv 值,则假设执行是通过 shebang 执行的,命令名称以“/”开头(shebang 可执行路径是绝对路径)并且 argv[1] 中的脚本名称是一个可执行文件。如果通过 shebang 执行,则参数列表是 argv[0] 拆分出来的,然后将 argv[2] 附加到该列表中。

我想知道这是否正确,或者是否有另一种方法可以更明确地确定这一点。我所做的工作适用于我需要使用的所有场景,但如果有更好的方法,我会很感兴趣。

4

0 回答 0