Как распознать ошибку при сохранении результата cmd из командной строки в виде строки в python?

#python-3.x #exception #command-prompt

Вопрос:

Этот код запускает команды python в командной строке и сохраняет вывод в виде строки:

 output = subprocess.run(
        ["python3", "-c", "print("hello")njj" ], stdout=subprocess.PIPE, timeout=3)
    output = output.stdout.decode('utf-8')
print(output)
 

Результатом будет:

 hello
 

В моем собственном cmd я получаю исключение:

 Traceback (most recent call last):
File "<string>", line 4, in <module>
NameError: name 'jj' is not defined
 

Я попытался написать попытку и исключение, но это тоже не сработает.

Я бы хотел, чтобы на выходе также была обнаружена ошибка, она будет выглядеть так:

 hello
Traceback (most recent call last):
File "<string>", line 4, in <module>
NameError: name 'jj' is not defined
 

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

1. Почему вы запускаете новый интерпретатор python изнутри python с помощью subprocess ? Есть гораздо более приятные способы запуска кода python изнутри python…

2. Например…? Я не хочу открывать новый файл

3. Почему бы просто не поместить «сломанную» строку печати в блок «попытка/исключение»? Зачем оборачивать его в новый интерпретатор python? вероятно, вам нужно объяснить, чего вы хотите достичь, так как это похоже на проблему X/Y.

4. В моей программе я не знаю фактического кода, я могу получить его только через строку

Ответ №1:

Возможно, это не самое практичное, но именно этим я и занялся:

 txt_str = 'print("hello")njj'.split("n")
command = "t".join([txt   n for txt in txt_str])
command = "try:n" 
         "t%sn" 
         "except Exception as e:n" 
         "tprint(e)" % (command, )
output = subprocess.run(
    ["python3", "-c", command], stdout=subprocess.PIPE, timeout=3)
output = output.stdout.decode('utf-8')