使用* list传递参数并不适用于execl

时间:2014-04-04 16:42:10

标签: python python-2.7 argv os.execl

我有一个python脚本,作为其他脚本的启动器。该脚本从输入参数启动脚本,以下是一些相关代码:

try:
    if verbose:
       print("Calling script ", args.script, " with arguments", *args.script_argument)
    os.execl(args.script, *args.script_argument)
except OSError as e:
    print("OSError: [Errno {0}] {1}: {2}".format(e.errno, e.strerror, args.script), file=sys.stderr)

argsparse_args()ArgumentParser返回的对象。使用args.script_arguments检索nargs=argparse.REMAINDER

这是启动器正在调用的脚本:

import sys

if __name__ == '__main__':
    print(sys.argv)

os.execl调用之前的打印中,我可以看到参数设置正确,但脚本打印的参数更少。

例如,如果使用./launcher.py -v script foo bar

调用启动器

启动器将打印Calling script script with arguments foo bar

但是,脚本会打印['script.py', 'bar']。为什么不从脚本中打印foo

1 个答案:

答案 0 :(得分:2)

传递给os.execl的第一个参数(在script参数之后)是" name"正在运行的程序(它可以是任何东西,不必是可执行文件的实际路径)。这是script.pysys.argv[0]视为argv[0]的内容(请参阅docs,还有this question,例如,解释os.execl(args.script, args.script, *args.script_argument) 如何运作)。

来自docs

  

argv [0]是脚本名称(取决于操作系统是否为完整路径名)

要获得您期望的行为,请将其命名为:

{{1}}