【问题标题】:How to hide PhantomJS console when running a GUI app in Py2Exe?在 Py2Exe 中运行 GUI 应用程序时如何隐藏 PhantomJS 控制台?
【发布时间】:2014-06-18 09:41:54
【问题描述】:

我用wxPython做了一个程序,用py2exe编译软件。当使用使用 PhantomJS 的软件功能时,首先会打开一个权限框,需要权限,然后我的 GUI 上会出现一个黑色的控制台框。这当然不专业。对于那些不熟悉 PhantomJS 的人,PhantomJS 是 Selenium 使用的一个 .exe。

  1. 当我的客户使用我的 wxPython 应用程序时,是否有隐藏控制台不出现?也许 py2exe 选项中的某些内容?

  2. 有没有一种无需征求用户许可即可使用 PhantomJS 的方法?或者至少将“PhantomJS 请求权限”更改为“我的软件请求权限”。我的客户并不真正知道 PhantomJS 是什么,所以他们都提交了一张票询问它。

谢谢!

【问题讨论】:

    标签: wxpython phantomjs py2exe


    【解决方案1】:

    我什至不知道 PhantomJS 是什么,但如果它是可执行文件,这可能会有所帮助。

    我通过使用 subprocess.Popen 从 wxPython 应用程序管道到 ffmpeg 并设置 shell 和 creationflags 选项。然后我看不到 ffmpeg 的控制台。

    import subprocess
    from win32process import CREATE_NO_WINDOW
    
    p = subprocess.Popen(
                cmdstring, 
                stdin=subprocess.PIPE,
                bufsize=-1, 
                shell=False,
                creationflags = CREATE_NO_WINDOW
                )
    

    (编辑)

    就像你写的那样,这里有两个问题。一个是关于 UAC,这可能很难完全解决,如https://stackoverflow.com/a/131092/566035 所述。但是因为无论如何你都是用 py2exe 打包的,你可以试试这个 py2exe 打包选项:https://stackoverflow.com/a/1445547/566035

    windows = [{
        'script': "yourapp.py",
        'uac_info': "requireAdministrator",
    },]
    

    这一行转到py2exe的setup.py文件来打包你的应用程序。

    使用这种方法,用户在启动 wxpython 应用程序时只会被要求提供一次 UAC 权限。 UAC 会说您的应用程序正在请求权限(而不是 PhantomJS)。

    另一个是控制台窗口,如上所述,它可以被 CREATE_NO_WINDOW 抑制。为了更完整,我添加了一个来自http://phantomjs.org/quick-start.html的示例

     phantomjs loadspeed.js http://www.google.com
    

    要从 wxpython 应用程序执行此命令,例如可以编写 wx.Frame 的方法,例如:

     def OnButton(self, event):
    
          cmdstring = ('phantomjs.exe', 'loadspeed.js', 'http://www.google.com')
          p = subprocess.Popen(
                cmdstring, 
                stdout=subprocess.PIPE,
                shell=False,
                creationflags = CREATE_NO_WINDOW
                )
    
         print p.stdout.read()  # to get the output from phantomjs.exe
    

    phantomjs.exe 和 loadspeed.js 需要在系统路径或者同一个文件夹。 我在我的电脑上做了一个测试,它把它打印为输出。

     Loading time 719 msec
    

    【讨论】:

    • 谢谢,但我到底在哪里写这段代码?在 py2exe 中?
    • 不在 py2exe 中。如果您可以通过 PIPE 与 PhantomJS exe 通信,那么您可以像上面一样重写使用 PhantomJS 的 wxpython 应用程序的部分。 cmdstring 将是 PhantomJS 的路径以及在元组中传递给它的所有选项。
    • uac_info 似乎奏效了。对于第二部分,这是我在代码中使用 phantomjs 的方式:from selenium import webdriverdriver = webdriver.PhantomJS("phantomjs.exe", desired_capabilities=dcap)
    • 现在我终于看到了问题所在!听起来你需要进入 selenium python binding 的源代码。可能修改源code.google.com/p/selenium/source/browse/py/selenium/webdriver/…self.process = subprocess.Popen开头的第60行
    • 非常感谢。现在会这样做。我还想提一下,我在 PyScripter 中运行时不会出现控制台,但是当我使用 py2exe 编译并运行 exe 时会出现。
    【解决方案2】:

    我今天花了很多时间来解决这个问题,终于找到了解决方法。

    正如 otterb 所说,魔鬼在 Phantomjs 驱动程序的 service.py 中的第 70 行。

    但是,我不知道模块“win32process”是什么以及如何在 Python 中安装它。 from win32process import CREATE_NO_WINDOW 所以,我无法将 creationflags 设置为 'CREATE_NO_WINDOW'。

    感谢 Alex Martelli,他确实在这里提供了替代方案: Running shell commands without a shell window

    因此,修改后的代码应该是:

    self.process = subprocess.Popen(self.service_args, stdin=subprocess.PIPE,
                                   close_fds=platform.system() != 'Windows',
                                   stdout=self._log, stderr=self._log, creationflags=0x08000000)
    

    希望这可以帮助遇到同样问题的人。

    【讨论】:

    • win32 安装起来有点棘手。但如果 CREATE_NO_WINDOW 是你所需要的,你可以像CREATE_NO_WINDOW = 134217728 那样硬编码它。这也有效。
    猜你喜欢
    • 2011-03-17
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2015-08-17
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多