我在wxPython中创建了一个程序,并使用py2exe编译软件。使用使用PhantomJS的软件功能时,首先打开一个权限框,需要权限,然后在我的GUI上显示黑色控制台框。它肯定不专业。对于那些不熟悉PhantomJS的人,PhantomJS是Selenium使用的.exe。
当我的客户使用我的wxPython应用程序时,是否有隐藏控制台出现?也许在py2exe选项中有什么东西?
有没有办法使用PhantomJS而无需向用户请求许可?或至少改变" PhantomJS请求许可" to"我的软件请求许可"。我的客户真的不知道PhantomJS是什么,所以他们都提交了一张询问它的票。
谢谢!
答案 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)
希望这可以帮助遇到同样问题的人。