如何从.pyw扩展的Python脚本打印到stdout?

10 投票
3 回答
2602 浏览
提问于 2025-04-17 04:56

我有一个用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 个回答

1

你可以告诉wxPython的应用程序实例进行重定向。只需要把“redirect”参数设置为True就可以了:

app = wx.App(True)

另一种解决办法是使用Python的日志模块,而不是依赖于将字符串打印到标准输出。使用这个模块,你可以将日志记录到文件中,或者通过各种网络协议发送日志,等等。想了解更多详细信息,可以查看文档:http://docs.python.org/library/logging.html

这里还有一个很好的入门教程:http://www.doughellmann.com/PyMOTW/logging/

3

我曾经用过一种方法,就是使用py2exe的自定义启动脚本,这样可以在命令行中有特定选项时,把sys.stdout的输出重定向到一个文件里。

等我找到一些示例代码的时候会分享给大家,不过你可以先看看这个链接,帮助你入门。

0

我终于用一种比较巧妙的方法解决了我的问题。我是这样从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,不过现在这样也能用。感谢大家的建议!

撰写回答