py3.6使用pyinstaller打包执行时报错FileNotFoundError:No such file or directory

参考链接:
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'])]
    )

在这个过程中发现,在某种程度上,确实不影响使用,但是如果你想要设置为开机自启动或自定义安装目录时失败的话,可能是由于你代码里的该路径在打包后被写死 。

posted @ 2019-03-18 15:01  苏酒酒  阅读(294)  评论(0编辑  收藏  举报