Ошибка Python при использовании os.popen () - PullRequest
2 голосов
/ 17 августа 2011

Что ж, у меня есть скрипт Python, работающий на Mac OS X. Теперь мне нужно изменить его, чтобы он поддерживал обновление моей рабочей копии SVN в указанное время. Однако после изучения я обнаружил, что команды SVN поддерживают только обновление рабочей копии до указанной версии.

Поэтому я пишу функцию для извлечения информации из команды: svn log XXX, чтобы найти соответствующую версию к указанному времени. Вот мое решение:

process=os.popen('svn log XXX')
print process.readline()
print process.readline()
process.close()

Чтобы упростить задачу, я просто печатаю первые 2 строки в выводе. Однако, когда я выполнял сценарий, я получил сообщение об ошибке: svn: Ошибка записи: Сломанный канал

Я думаю, что причина, по которой я получил сообщение, заключается в том, что команда svn продолжала выполняться, когда я закрывал Popen. Так что сообщение об ошибке возникает.

Есть ли кто-нибудь, кто может помочь мне решить проблему? Или дайте мне альтернативное решение для достижения цели. Спасибо!

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Пожалуйста, используйте pysvn. Это довольно просто в использовании. Или используйте подпроцесс.

Появляется ли ошибка по-прежнему, если вы, наконец, делаете:

print process.read()

И лучше вызывать wait (), если вы используете os.popen или подпроцесс.

1 голос
/ 17 августа 2011

Я получаю эту ошибку всякий раз, когда использую svn log | head, это тоже не специфично для Python. Попробуйте что-то вроде:

from subprocess import PIPE, Popen

process = Popen('svn log XXX', stdout=PIPE, stderr=PIPE)
print process.stdout.readline()
print process.stdout.readline()

для подавления stderr. Вы также можете просто использовать

stdout, stderr = Popen('svn log XXX | head -n2', stdout=PIPE, stderr=PIPE, shell=True).communicate()
print stdout
...