我在wxPython中制作了一个程序,并使用py2exe编译软件。当使用使用PhantomJS的软件功能时,首先会打开一个需要权限的权限框,然后我的GUI上会出现一个黑色控制台框。这当然不专业。对于那些不熟悉PhantomJS的人来说,PhantomJS是Selenium使用的.exe。
-
当我的客户使用我的wxPython应用程序时,是否有任何方法可以隐藏控制台以防止其出现?也许py2exe选项中有什么?
-
有没有一种方法可以使用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)
希望这能帮助任何遇到同样问题的人。