Передача аргумента с * списком не работает с 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)

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?

1 ответ

Первый аргумент, который вы передаете os.execl (после аргумента script), - это "имя" выполняемой программы (это может быть что угодно, не обязательно должен быть фактическим путем к исполняемому файлу). То, что script.py увидит как sys.argv[0] (см. Документы, а также этот вопрос, например, объясняя, как работает argv[0]).

Из документов:

argv [0] - это имя сценария (зависит от операционной системы, является ли это полным именем пути или нет)

Чтобы получить ожидаемое поведение, назовите его так:

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

licensed under cc by-sa 3.0 with attribution.