如何从.pyw扩展的Python脚本打印到stdout?
我有一个用Python写的程序,里面有一个wxpython的图形界面和一些命令行参数。我用py2exe生成了一个单独的Windows可执行文件。我不想在后台出现一个命令行窗口,所以py2exe把这个文件做成了一个没有窗口的pythonw可执行文件。这就相当于使用了*.pyw这个扩展名。
问题是,如果你想查看可用的命令行参数,通常会在命令行输入“main.exe -h”。虽然argparse可以提供这些信息,但因为使用了*.pyw扩展名,这些信息不会显示在标准输出(stdout)上。
那么,我该如何让一个使用pythonw的图形界面应用程序重新启用标准输出呢?
最小可运行示例:
# test.py
print "hello"
执行:
#> python test.py
hello
#> pythonw test.py
#>
感谢任何建议!
3 个回答
你可以告诉wxPython的应用程序实例进行重定向。只需要把“redirect”参数设置为True就可以了:
app = wx.App(True)
另一种解决办法是使用Python的日志模块,而不是依赖于将字符串打印到标准输出。使用这个模块,你可以将日志记录到文件中,或者通过各种网络协议发送日志,等等。想了解更多详细信息,可以查看文档:http://docs.python.org/library/logging.html
这里还有一个很好的入门教程:http://www.doughellmann.com/PyMOTW/logging/
我曾经用过一种方法,就是使用py2exe的自定义启动脚本,这样可以在命令行中有特定选项时,把sys.stdout
的输出重定向到一个文件里。
等我找到一些示例代码的时候会分享给大家,不过你可以先看看这个链接,帮助你入门。
我终于用一种比较巧妙的方法解决了我的问题。我是这样从argparse获取帮助信息的:
class Parser(object):
def __init__(self):
[...init argparser...]
self.help = ""
self.__argparser.print_help(self)
def write(self, message):
self.help += message
然后我把帮助信息显示在关于对话框里。
我还是希望能重新启用 sys.stdout
,不过现在这样也能用。感谢大家的建议!