Python - получить Popen stdout И отобразиться на консоли?

О, это - интересный зверь.

я провел большое количество времени разбирания в этом, существует три основных вопроса, который отличается от локали до локали: - обозначение денежной единицы и направление - тысяча разделителя - десятичная точка

я записал свою собственную довольно обширную реализацию этого, которое является частью платформы Python киви, проверьте источник LGPL:ed здесь:

http://svn.async.com.br/cgi-bin/viewvc.cgi/kiwi/trunk/kiwi/currency.py?view=markup

код является немного конкретным Linux/Glibc, но не должен быть слишком трудным для принятия к окнам или другому unixes.

, После того как Вам установили это, можно сделать следующее:

>>> from kiwi.datatypes import currency
>>> v = currency('10.5').format()

, Который затем даст Вам:

'$10.50'

или

'10,50 kr'

В зависимости от в настоящее время выбираемой локали.

основной момент это сообщение имеет по другому, то, что это будет работать с более старыми версиями Python. locale.currency был представлен в python 2.5.

5
задан Steve Folly 15 August 2009 в 22:48
поделиться

4 ответа

Можете ли вы просто напечатать это так, как вы читаете из трубы?

1
ответ дан 13 December 2019 в 22:12
поделиться

S. Lott's comment points to Getting realtime output using subprocess and Real-time intercepting of stdout from another process in Python

I'm curious that Alex's answer here is different from his answer 1085071. Мои простые небольшие эксперименты с ответами на два других упомянутых вопроса дали хорошие результаты ...

Я пошел и посмотрел на wexpect в соответствии с ответом Алекса выше, но я должен сказать, что, прочитав комментарии в коде, меня не оставили очень хорошее ощущение от его использования.

Думаю, мета-вопрос здесь заключается в том, когда pexpect / wexpect станет одной из прилагаемых батарей?

2
ответ дан 13 December 2019 в 22:12
поделиться

Буферизация, которую выполняет ваш длительный подпроцесс, вероятно, сделает вывод на консоль прерывистым и приведет к очень плохому UX. Я предлагаю вам вместо этого рассмотреть возможность использования pexpect (или, в Windows, wexpect ), чтобы преодолеть такую ​​буферизацию и получить плавный, регулярный вывод из подпроцесса. Например (практически в любой системе unix-y после установки pexpect):

>>> import pexpect
>>> child = pexpect.spawn('/bin/bash -c "echo ba; sleep 1; echo bu"', logfile=sys.stdout); x=child.expect(pexpect.EOF); child.close()
ba
bu
>>> child.before
'ba\r\nbu\r\n'

ba и bu будут приходить с правильным временным интервалом (между ними примерно секунда). Обратите внимание, что вывод не подлежит нормальной обработке терминалом, поэтому символы возврата каретки остаются там - вам нужно будет обработать строку самостоятельно (просто .replace !

5
ответ дан 13 December 2019 в 22:12
поделиться

В качестве альтернативы вы можете направить свой процесс в tee и захватить только один из потоков. Что-то вроде sh -c 'обрабатывать интересные вещи' | tee /dev/stderr.[12145 impression Конечно, это работает только в Unix-подобных системах.

1
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: