Когда вы вызываете subprocess.call(['a', 'b', 'c'])
, он будет вызывать программу a
с передачей аргументов:
argv[0] = "a"
argv[1] = "b"
argv[2] = "c"
Обычно имя вызываемой программы передается как argv[0]
, так что это удобная комбинация для предположения, что первый аргумент также является исполняемым файлом.
Если вы хотите более расширенный контроль над программой, вы можете указать аргумент executable
. Если вы позвоните subprocess.call(['x', 'b', 'c'], executable='a')
, он вызовет программу a
с передачей аргументов:
argv[0] = "x"
argv[1] = "b"
argv[2] = "c"
Теперь значение argv[0]
не соответствует имени исполняемого файла. Это имеет значение? Ну, это зависит от программы. Большинство программ не смотрят на это, потому что не имеет значения, переименовываете ли вы программу. Однако некоторые программы, такие как busybox
, предназначены для вызова под разными именами, и они используют argv[0]
, чтобы изменить ситуацию.
В вашем случае, когда вы вызываете subprocess.call(["build", "-u"], executable=exe)
, вы запускаете правильную программу, но с аргументами:
argv[0] = "build"
argv[1] = "-u"
argv[0]
игнорируется, так как принимается за название программы; затем он встречает -u
и не знает, что с ним делать. Таким образом, ошибка.
Решение состоит в том, чтобы указать разумное значение для argv[0]
:
subprocess.call(["SAM", "build", "-u"], executable=exe)
Но тогда наиболее разумным значением обычно является exe
, и тогда вы можете удалить необязательный аргумент exectuable
и просто написать:
subprocess.call([exe, "build", "-u"])
ваш рабочий код.