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

时间:2014-05-01 20:07:13

标签: wxpython phantomjs py2exe

我在wxPython中创建了一个程序,并使用py2exe编译软件。使用使用PhantomJS的软件功能时,首先打开一个权限框,需要权限,然后在我的GUI上显示黑色控制台框。它肯定不专业。对于那些不熟悉PhantomJS的人,PhantomJS是Selenium使用的.exe。

  1. 当我的客户使用我的wxPython应用程序时,是否有隐藏控制台出现?也许在py2exe选项中有什么东西?

  2. 有没有办法使用PhantomJS而无需向用户请求许可?或至少改变" PhantomJS请求许可" to"我的软件请求许可"。我的客户真的不知道PhantomJS是什么,所以他们都提交了一张询问它的票。

  3. 谢谢!

2 个答案:

答案 0 :(得分:3)

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

我通过使用subprocess.Popen并设置shell和creationflags选项从wxPython app管道到ffmpeg。然后我看不到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 app执行此命令,可以编写一个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

答案 1 :(得分: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)

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