#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 ‘ и прочитал этот указатель на файл. Поэтому я не получил никаких отображаемых данных. Я закрыл его и открыл с разрешением на чтение, а затем прочитал содержимое, и оно работает нормально.