Python在使用PyExecJS执行JS脚本时,会有黑窗一闪而过?

71次阅读
没有评论

在python和python3的IDLE下,引用execjs库执行JS脚本时,黑窗一闪而过,然后返回结果,但在cmd下用python XX.py命令执行时却不会出现黑窗 直接就打印结果了

上干货:

找到你的python安装目录下的lib/site-packages/execjs/_external_runtime.py文件

将其中的:

def _exec_with_pipe(self, source):
    cmd = self._runtime._binary()
    p = None
    try:
        p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=self._cwd, universal_newlines=True)
        input = self._compile(source)
        if six.PY2:
            input = input.encode(sys.getfilesystemencoding())
        stdoutdata, stderrdata = p.communicate(input=input)
        ret = p.wait()
    finally:
        del p
    self._fail_on_non_zero_status(ret, stdoutdata, stderrdata)
    return stdoutdata

替换为:

def _exec_with_pipe(self, source):
    cmd = self._runtime._binary()
    p = None
    try:
        startupinfo = subprocess.STARTUPINFO()
        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
        p = Popen(cmd, startupinfo=startupinfo, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=self._cwd, universal_newlines=True)
        input = self._compile(source)
        if six.PY2:
            input = input.encode(sys.getfilesystemencoding())
        stdoutdata, stderrdata = p.communicate(input=input)
        ret = p.wait()
    finally:
        del p
    self._fail_on_non_zero_status(ret, stdoutdata, stderrdata)
    return stdoutdata

即可。

再次使用pyinstaller来打包用PyExecJS库来执行js的GUI应用就看不到那个烦人的黑框了!!!

原理:

出现pyinstaller打包程序黑窗一闪而过的原因,是因为call的最终执行的函数是_external_runtime.py里面某个类里的_exec_with_pipe(self, source)。

它使用的其实是Popen来实现执行js的功能。这个Popen,默认情况下当然会有黑色命令行界面的存在,在pyinstaller打包时设置了不要命令行界面也没有用。

找到了问题的原因,那就解决它,我们知道,Popen设置startupinfo为STARTF_USESHOWWINDOW即可隐藏命令行界面窗口,那我们只需要修改_external_runtime.py这个文件 即可达到我们想要的效果。

迷鹿, lostfawn
版权声明:本站原创文章,由 迷鹿, lostfawn2021-11-30发表,共计1398字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码
载入中...