Как отличить ошибки подпроцесса в python? - PullRequest
0 голосов
/ 19 мая 2019

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

Первый: В настоящее время я использую OSError для всех ошибок, возникающих при использовании subprocess.Popen.

Код для этогоздесь:

try:
    subprocess.Popen([command])
except OSError:
    print("'" + command[0] + "' is not recognised as a command, program or bterm file.")

Когда я набираю python, он правильно открывает командную строку python.Когда я набираю asdfa, он возвращает ошибку.Проблема в том, что когда я набираю python non-existent-file.py, я получаю ту же ошибку, когда проблема связана с дочерним аргументом.

Я хочу, чтобы терминал возвращал (null): can't open file 'test': [Errno 2] No such file or directory, как при вызове из cmd или bash.

Как я могу различить эти 2 ошибки, сохраняя свое пользовательское сообщение об ошибке, когда файл не существует?

Секунда: Всякий раз, когда я передаю несколькослово args в subprocess.Popen или subprocess.call Я автоматически получаю эту ошибку, которую я не получаю, используя os.system()

Я не хочу использовать os.system, потому что не могу вызвать пользовательские ошибкис ним.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Сначала вы можете проверить наличие исполняемого файла с помощью shutil.which.

if shutil.which(commands[0]):
    try:
        subprocess.Popen([commands])
    except OSError as err:
        print(err)
else:
    print("'{}' is not recognised as a command, program or bterm file.".format(commands[0])

Однако в документации много информации: https://docs.python.org/dev/library/subprocess.html, что может быть полезно.

Редактировать: показал, как захватить вывод, благодаря Auxilor

1 голос
/ 19 мая 2019

Исключения в вызовах подпроцесса:

Исключения, возникшие в дочернем процессе до того, как новая программа начала выполняться, будут повторно вызваны в родительском процессе. Кроме того, объект исключения будет иметь один дополнительный атрибут child_traceback, который представляет собой строку, содержащую информацию трассировки с точки зрения дочернего элемента.

Наиболее распространенное исключение - OSError . Это происходит, например, при попытке выполнить несуществующий файл. Приложения должны готовиться к исключениям OSError.

A ValueError будет вызвано, если Popen вызывается с недопустимыми аргументами.

check_call () и check_output () вызовет CalledProcessError , если вызываемый процесс возвращает ненулевой код возврата.

Вы можете найти больше на: https://docs.python.org/2/library/subprocess.html#exceptions

Кроме того, вы можете найти Исключительную иерархию по адресу: https://docs.python.org/2/library/exceptions.html#exception-hierarchy

try:
    output = subprocess.check_output("\\test.exe')
except subprocess.CalledProcessError as e:
    print("Something Fishy... returncode: " + e.returncode + ", output:\n" + e.output)
else:
    print("Working Fine:\n" + output)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...