#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 было допустимым именем переменной, поэтому я просто предположу, что вы предоставили это в качестве примера.
Теперь, что более важно, что вы пытаетесь сделать с подпроцессом? Просто запустите ее и пусть это будет основной операцией? Запустить ее и зафиксировать результат? Запустить ее в фоновом режиме?
Документация к модулю подпроцесса довольно понятна и содержит множество примеров того, как вы могли бы его использовать.