pyinstaller打包exe时subprocess无效的解决方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pyinstaller打包exe时subprocess无效的解决方法相关的知识,希望对你有一定的参考价值。
参考技术A Windows 10Python 3.5.2
PyQt5
pyinstaller
使用pyinstaller打包exe,最近在打包包含subprocess.Popen时发现,加上参数—noconsole时产生的exe文件在运行的时候,进程并没有运行。经过一番google,问题得以解决,现将解决方法记录一下,形成此文。
我这里需要利用subprocess.Popen创建一个进程去执行一个命令行操作,
mProcess = subprocess.Popen(cmd,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pyinstaller打包操作命令如下
pyinstaller -F -w xxx.py
打包后生成的exe,可以运行,不过查看进程并没有如预期正确地工作。
在创建进程时,加上startupinfo参数,如下
si = subprocess.STARTUPINFO()
si.dwFlags|= subprocess.STARTF_USESHOWWINDOW
mProcess=subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,startupinfo=si)
问题完美解决,具体可以参考下 http://blog.csdn.net/djstavav/article/details/61629851
Pyinstaller如何将资源文件一起打包至exe中
基本原理:Pyinstaller 可以将资源文件一起bundle到exe中,当exe在运行时,会生成一个临时文件夹,程序可通过sys._MEIPASS访问临时文件夹中的资源
官方说明:https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation
测试案例功能描述,访问资源文件夹res/a.txt,并打印其内容。实现方法如下:
源码如下,比较简单,resource_path方法说明了如何使用sys._MEIPASS变量来访问临时文件夹中的资源
#coding:utf-8 import sys import os #生成资源文件目录访问路径 def resource_path(relative_path): if getattr(sys, ‘frozen‘, False): #是否Bundle Resource base_path = sys._MEIPASS else: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) #访问res文件夹下a.txt的内容 filename = resource_path(os.path.join("res","a.txt")) print(filename) with open(filename) as f: lines = f.readlines() print(lines) f.close()
结下来介绍如何生成exe
首先需要生成spec文件,pyi-makespec -F test.py
编辑spec文件,在datas选项中说明需要将哪些文件加入exe,在零时文件夹中命名成什么
以下图为例,意思将test.py当前目录下的res目录(及其目录中的文件)加入目标exe中,在运行时放在零时文件的根目录下,名称为res
生成EXE文件,pyinstaller -F test.spec
运行生成的EXE,可以看到资源生成的临时文件夹路径
以上是关于pyinstaller打包exe时subprocess无效的解决方法的主要内容,如果未能解决你的问题,请参考以下文章
pyinstaller打包exe,运行时读取配置文件报错:NoSectionError,windows
pyinstaller打包exe,运行时读取配置文件报错:NoSectionError,windows