Проблема с поведением функции subprocess.check_output - PullRequest
0 голосов
/ 30 января 2020

мой код:

import subprocess

answer = subprocess.check_output("python ../pydig/pydig @1.1.1.1 +tls=noauth goowdqdqdqdgle.de A",  encoding='utf8')
print (answer)

Pydig - это библиотека для поиска доменных имен. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я выполняю эту программу, она сообщает мне subprocess.CalledProcessError:

subprocess.CalledProcessError: Command 'python ../pydig/pydig @1.1.1.1 +tls=noauth goowdqdqdqdgle.de A' returned non-zero exit status 3.

Но когда я выполняю команду pydig @1.1.1.1 +tls=noauth goowdqdqdqdgle.de A через командную строку, она дает мне действительный вывод.

Как это возможно?

Спасибо за помощь.

Привет

1 Ответ

0 голосов
/ 30 января 2020

Проблема в том, что check_output не даст выходных данных команды в случае сбоя команды.

Если код возврата был ненулевым, вызывает CalledProcessError. У объекта CalledProcessError будет код возврата в атрибуте returncode и любые выходные данные в атрибуте output.

Поскольку веб-сайт не существует, команда возвращает ошибку, и все, что вы получаете, это python исключение. Если вы все равно хотите получить выходные данные, используйте subprocess.Popen или subprocess.run (python 3.5+) с перенаправлением вывода / ошибки.

Также всегда используйте список аргументов, а не строк.

Пример с Popen

handle = subprocess.Popen(["python","../pydig/pydig","@1.1.1.1","+tls=noauth","goowdqdqdqdgle.de","A"], stdout=subprocess.PIPE,stderr=subprocess.PIPE  encoding='utf8')
out,err = handle.communicate()
return_code = handle.wait()
print(return_code,out.decode(),err.decode())

обратите внимание, что поскольку команда для запуска является кодом python, вы можете заменить первый аргумент "python" на sys.executable (поэтому он работает с тем же интерпретатор как ваш сценарий) или найдите, если невозможно импортировать модуль и вызвать функцию (избегает порождения подпроцесса / сохраняет цепочку исключений)

...