在Py2Exe中运行GUI应用程序时,如何隐藏PhantomJS控制台



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

  1. 当我的客户使用我的wxPython应用程序时,是否有任何方法可以隐藏控制台以防止其出现?也许py2exe选项中有什么?

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

谢谢!

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

我使用子进程从wxPython应用程序管道传输到ffmpeg。Popen并设置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方法。类似框架:

 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

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

正如Ottb所提到的,魔鬼在Phantomjs司机的服务中的70号线。

然而,我不知道模块"win32process"是什么,也不知道如何在Python中安装它。from win32process import CREATE_NO_WINDOW因此,我无法将creationflags设置为"CREATE_NO_INDOW"。

多亏了Alex Martelli,他在这里提供了一个替代方案:在没有shell窗口的情况下运行shell命令

因此,修改后的代码应为:

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

希望这能帮助任何遇到同样问题的人。

最新更新