Как распечатать на стандартный вывод из скрипта Python с расширением .pyw? - PullRequest
9 голосов
/ 25 октября 2011

У меня есть программа на Python с графическим интерфейсом wxpython и некоторыми параметрами командной строки. Я генерирую один исполняемый файл Windows с py2exe. Я не хочу иметь окно командной строки в фоновом режиме, поэтому py2exe делает этот исполняемый файл pythonw без этого окна. Это эквивалентно использованию расширения * .pyw.

Проблема в том, что если вы хотите увидеть доступные аргументы командной строки, вы, естественно, делаете «main.exe -h» в оболочке. Хотя argparse предоставляет эту информацию, он не достигает стандартного вывода из-за расширения * .pyw.

Так как же я могу снова включить stdout для приложения с графическим интерфейсом, использующего pythonw?

минимальный рабочий пример:

# test.py
print "hello"

исполнение:

#> python test.py
hello
#> pythonw test.py
#> 

Заранее спасибо за любые предложения!

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

Один из способов сделать это - использовать сценарий пользовательской загрузки py2exe для перенаправления sys.stdout в файл при наличии определенного переключателя командной строки.

Я будуу меня есть пример кода, когда я могу его выкопать, но проверьте ссылку, чтобы начать.

1 голос
/ 25 октября 2011

Вы также можете указать экземпляру приложения wxPython для перенаправления. Просто установите для параметра «redirect» значение True:

app = wx.App(True)

Другим решением было бы использование модуля журналирования Python вместо того, чтобы полагаться на вывод строк в стандартный вывод. Используя это, вы можете войти в файл или в различные веб-протоколы, среди прочего. См. Документацию для получения полной информации: http://docs.python.org/library/logging.html

Здесь также есть хорошее вводное руководство: http://www.doughellmann.com/PyMOTW/logging/

0 голосов
/ 09 февраля 2012

Я наконец решил свою проблему с помощью какого-то противного трюка.Я получаю справочную информацию из argparse следующим образом:

class Parser(object):
    def __init__(self):
        [...init argparser...]
        self.help = ""
        self.__argparser.print_help(self)
    def write(self, message):
        self.help += message

Затем я просто показываю справочную информацию в диалоговом окне about.

Я бы все же предпочел повторно включить sys.stdout, но пока это работает.Спасибо за все предложения!

...