【问题标题】:Passing argument with *list doesn't work with execl使用 *list 传递参数不适用于 execl
【发布时间】:2014-05-17 02:23:31
【问题描述】:

我有一个 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)

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

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

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

【问题讨论】:

    标签: python python-2.7 argv os.execl


    【解决方案1】:

    传递给os.execl 的第一个参数(在script 参数之后)是正在运行的程序的“名称”(它可以是任何东西,不必是可执行文件的实际路径) .这就是script.py 所看到的sys.argv[0](参见docsthis question,例如,解释argv[0] 的工作原理)。

    来自docs

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

    要获得您期望的行为,可以这样称呼它:

    os.execl(args.script, args.script, *args.script_argument)
    

    【讨论】:

    • 确实,这就是解决方案。但是,我仍然不清楚。如果execl 的第一个参数是脚本的名称,第二个是路径,则使用execl(script, *args) 调用它,其中args 是一个列表,应该使用列表的第一个元素作为脚本的路径,是不是吗?
    • 第一个是路径,第二个是名称。
    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多