【问题标题】:How to print to stdout from Python script with .pyw extension?如何使用 .pyw 扩展名从 Python 脚本打印到标准输出?
【发布时间】:2011-12-14 13:19:59
【问题描述】:

我有一个带有 wxpython GUI 和一些命令行参数的 python 程序。我用 py2exe 生成了一个单一的 windows 可执行文件。我不想在后台有一个命令行窗口,所以 py2exe 使它成为一个没有这个窗口的 pythonw 可执行文件。这相当于使用 *.pyw 扩展名。

问题是,如果您想查看可用的命令行参数,您自然会在 shell 上执行“main.exe -h”。尽管 argparse 提供了这些信息,但由于 *.pyw 扩展名,它不会到达标准输出。

那么如何使用 pythonw 为 GUI 应用程序重新启用标准输出?

最小的工作示例:

# test.py
print "hello"

执行:

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

提前感谢您的任何建议!

【问题讨论】:

标签: python windows wxpython stdout pythonw


【解决方案1】:

我做到这一点的一种方法是使用 py2exe 的 custom-boot-script 在存在某个命令行开关时将 sys.stdout 重定向到文件。

当我可以挖掘它时,我会在此处提供一些示例代码,但请查看链接以帮助您入门。

【讨论】:

  • 谢谢,但我更愿意让sys.stdout 回到命令行。你有一个想法如何做到这一点?
  • 不幸的是,我认为您不能这样做,因为控制台子系统没有使用 .pyw 文件进行初始化。您必须使用 Win32 API AllocConsole 调用做一些讨厌的事情才能让您的标准输出回到控制台窗口。
【解决方案2】:

您也可以告诉 wxPython 的 App 实例进行重定向。只需将“重定向”参数设置为 True:

app = wx.App(True)

另一种解决方案是使用 Python 的日志记录模块,而不是依赖将字符串打印到标准输出。使用它,您可以登录到文件或各种 Web 协议等。详细信息请参阅文档:http://docs.python.org/library/logging.html

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

【讨论】:

    【解决方案3】:

    我终于用某种令人讨厌的技巧解决了我的问题。我像这样从 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,但这目前有效。 感谢所有建议!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多