参考链接:
1、https://blog.csdn.net/pipisorry/article/details/50620495
2、https://pythonhosted.org/PyInstaller/spec-files.html#adding-data-files
在py3.6使用pyinstaller打包时很顺利,但是在执行exe文件时报错:
FileNotFoundError: [Errno 2] No such file or directory: 'logging.json'
[5648] Failed to execute script agent
因为出错的这个文件恰恰不是py文件,也不是其他,而是配置文件,一开始并没有想到这是数据文件,但我觉得肯定是因为这个文件类型不同的原因。
解决办法有两个:
1、最简单的就是将跟.json相关的文件放到dist目录下(生成的exe在dist目录下,并且要使用exe时,要挪动一整个dist目录),执行就OK了。
2、打开.spec文件,里面 有一个
a = Analysis(['your_py.py'],
pathex=['your_py_path'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
其中第四行有一个datas的列表,只需要把相对文件名添加进去即可。
数据文件列表是元组列表。每个元组都有两个值,两个值都必须是字符串:
第一个字符串指定现在在此系统中的文件。
第二个指定在运行时包含文件的文件夹的名称。即运行时要读取的数据文件的真实目录(没打包前的目录,可以是spec文件的相对目录,也可以是绝对路径)
如:
datas = [('a/dist/logging.json', ‘dist/logging.json’)]
这一步和py2exe的有点类似,py2exe生成exe需要单独写一个setup.py,其中有一个setup里有个data_files,也是指定数据文件用的。
setup(
name='agent',
console=['agent.py'],
data_files=[('', ['settings.json', 'logging.json'])]
)
在这个过程中发现,在某种程度上,确实不影响使用,但是如果你想要设置为开机自启动或自定义安装目录时失败的话,可能是由于你代码里的该路径在打包后被写死 。