подпроцесс.Popen не сохраняет исключение для файла ошибки

#python #popen

#python #popen

Вопрос:

Я пытался выполнить скрипт python из другого скрипта python, используя subprocess .Popen. Моя команда была:

 outf = open('out.txt','w ')
errf = open('err.txt','w ')
p = subprocess.Popen([cmd],stdin=inf,stdout=outf,stderr=errf,shell=True)
  

все необходимые определены ранее. Это не создает проблем для передачи в стандартный файл. Но, когда в скрипте python есть ошибки, он завершается с ошибкой. Эта ошибка не сохраняется ни в файле стандартного вывода, ни в файле stderr. Что мне с этим делать?

Я понимаю, что файл был закрыт из-за ошибки, используя p.returncode . Но как мне получить обратную трассировку ошибки?

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

1. пожалуйста, предоставьте больше контекста. как вы инициализируете errf ?

2. @Pavel: Добавлено. И нет никаких проблем с этой инициализацией, так как, если она выполняется без ошибок, выходные данные сохраняются в out.txt

3. Вы правильно закрываете файлы? Вы должны использовать open файлы, но не close использовать их.

4. @Bakuriu Хорошая идея, но мне не нужно было закрывать файлы ниже в моем примере.

Ответ №1:

Это работает для меня:

 $ cat pytest1.py 
#!/usr/bin/env python

for i in ranger(5):
    print "hi"

>>> outf = open('out.txt','w ')
>>> errf = open('err.txt','w ')
>>> p = subprocess.Popen(["./pytest1.py"],stdout=outf,stderr=errf,shell=True)
>>> a,b = p.communicate()
>>> p.returncode
1
>>> a
>>> b
  

Вы также можете использовать:

 >>> p = subprocess.Popen("./pytest1.py",stdout=outf,stderr=errf,shell=True)
  

Ошибка заполняется в err.txt

 $ cat out.txt
$ cat err.txt
Traceback (most recent call last):
  File "./pytest1.py", line 3, in <module>
    for i in ranger(5):
NameError: name 'ranger' is not defined
  

Ответ №2:

Извините, ошибка была моей.. Я открыл файлы с разрешениями ‘w ‘ и прочитал этот указатель на файл. Поэтому я не получил никаких отображаемых данных. Я закрыл его и открыл с разрешением на чтение, а затем прочитал содержимое, и оно работает нормально.