При использовании subprocess.Popen в чем разница между использованием исполняемого параметра и наличием пути exe в качестве первого элемента команды? - PullRequest
0 голосов
/ 15 января 2019

Я пытался запустить SAM CLI для сборки и запуска локального API через Python.

Похоже, есть разница между использованием исполняемого параметра в подпроцессе . Откройте и указанием пути к exe в качестве первого элемента в аргументах список. Я думаю это потому, что SAM CLI возвращает разные ответы в зависимости от метода, который я использовал. В чем разница между двумя подходами, которые я использую? Почему первый метод терпит неудачу?

Первый метод

subprocess.call(["build", "-u"], cwd=cwd, stdout=f, stderr=f, shell=False, executable=exe)

Сбой и возврат: Ошибка: нет такой опции: -u

Второй метод

subprocess.call([exe, "build", "-u"], cwd=cwd, stdout=f, stderr=f, shell=False)

Работает и проходит через процесс.

exe хранит путь к 'sam.exe'

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Когда вы вызываете 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"])

ваш рабочий код.

0 голосов
/ 15 января 2019

Из строки документа Popen

executable: выполняется программа замены.

      input, standard output and standard error file handles, respectively.

снизу в коде

        ...
        if shell:
            args = ["/bin/sh", "-c"] + args
            if executable:
                args[0] = executable

, поэтому флаг executable указывает, какую программу использовать и выполнить команду. По умолчанию запускается с использованием оболочки, но вы можете указать по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...