Как запустить программу со многими аргументами в Python / Linux

#python #windows #linux #process #attributes

#python #Windows #linux #процесс #атрибуты

Вопрос:

Следующий код отлично работает в Windows:

 subprocess.Popen([PATH_TO_G  ]/g   file.cpp -o file.exe)
  

Однако в Linux я получаю следующую ошибку:

Ошибка операционной системы: [Ошибка 2] Такого файла или каталога нет

После прочтения документации и нескольких потоков SO я обнаружил этот подпроцесс.Popen работает по-разному в системах Windows и nix. В Windows она принимает строку в качестве параметра и запускает ее точно так же, как вы запускаете ее в терминале.

Однако в Linux для этого требуется список строк, если у вас есть параметры. Первое значение — это сама программа, затем идут атрибуты. Вы можете заставить ее вести себя как Windows, передав аргумент Shell= True, но для меня это не очень хорошее решение.

Я попробовал функцию shlex.split, но она по-прежнему не работает.

Комментарии:

1. Вы пробовали `subprocess. Popen([«progpath», «arg1», «arg2», «arg3»])?

2. @khachik, да, но я, возможно, неправильно их понял. Как использовать аргументы в моем примере?

3. вы можете передавать параметры в виде последовательности на всех платформах. в чем ваш актуальный вопрос?

4. ваш пример не имеет смысла, потому что это недопустимый синтаксис. Не могли бы вы, пожалуйста, предоставить код, который вызывает «Нет такого файла или каталога»?

Ответ №1:

Основываясь на вашем примере, вам нужно убедиться, что команда правильно заключена в кавычки:

 subprocess.Popen([PATH_TO_G     "/g  ", "file.cpp", "-o", "file.exe"])
  

Не может быть, чтобы PATH_TO_G было допустимым именем переменной, поэтому я просто предположу, что вы предоставили это в качестве примера.

Теперь, что более важно, что вы пытаетесь сделать с подпроцессом? Просто запустите ее и пусть это будет основной операцией? Запустить ее и зафиксировать результат? Запустить ее в фоновом режиме?

Документация к модулю подпроцесса довольно понятна и содержит множество примеров того, как вы могли бы его использовать.