我有一个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
返回的对象。使用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
?
答案 0 :(得分:2)
传递给os.execl
的第一个参数(在script
参数之后)是" name"正在运行的程序(它可以是任何东西,不必是可执行文件的实际路径)。这是script.py
将sys.argv[0]
视为argv[0]
的内容(请参阅docs,还有this question,例如,解释os.execl(args.script, args.script, *args.script_argument)
如何运作)。
来自docs:
argv [0]是脚本名称(取决于操作系统是否为完整路径名)
要获得您期望的行为,请将其命名为:
{{1}}