О, это - интересный зверь.
я провел большое количество времени разбирания в этом, существует три основных вопроса, который отличается от локали до локали: - обозначение денежной единицы и направление - тысяча разделителя - десятичная точка
я записал свою собственную довольно обширную реализацию этого, которое является частью платформы 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.
Можете ли вы просто напечатать
это так, как вы читаете из трубы?
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 станет одной из прилагаемых батарей?
Буферизация, которую выполняет ваш длительный подпроцесс, вероятно, сделает вывод на консоль прерывистым и приведет к очень плохому 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
!
В качестве альтернативы вы можете направить свой процесс в tee и захватить только один из потоков.
Что-то вроде sh -c 'обрабатывать интересные вещи' | tee /dev/stderr
.[12145 impression Конечно, это работает только в Unix-подобных системах.