如何编写一个Python解释器,使其可以使用shebang来加载解释器。

8 浏览
0 Comments

如何编写一个Python解释器,使其可以使用shebang来加载解释器。

我用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可执行文件的路径是绝对路径),并且argv[1]中的脚本名是可执行文件,那么执行是通过shebang进行的。如果是通过shebang执行,则参数列表是argv[0]拆分后加上argv[2]及之后的参数。

我想知道这样做是否正确,或者是否有另一种更确定的方法来确定这一点。我所做的对于我需要使用的所有场景都很好,但如果有更好的方法,我很愿意学习。

0