这是我的系统信息:
123 INFO: PyInstaller: 4.0
123 INFO: Python: 3.5.4
124 INFO: Platform: Windows-10-10.0.18362-SP0
我一直在尝试使用Pyinstaller生成Python(PyQt)可执行文件以在应用程序中使用。但是,当我打包可执行文件并运行它时,它将抛出以下内容:
pkg_resources.DistributionNotFound: The 'flask-compress' distribution was not found and is required
by the application
[14684] Failed to execute script main
我的虚拟环境中已经存在此依赖关系,因此我尝试指定站点包目录的路径和flask_compress导入,如下所示:
pyinstaller --paths C:\Users\alan9\PycharmProjects\PracticumProject\venv\Lib\site-packages --hidden-import=flask_compress main.py
注意:我试图在Windows 7/10的干净副本上,在装有Windows 7/10的不同计算机上,使用不同的python版本,具有不同的pyinstaller标志(onefile,window,onedir)为此应用程序创建可执行文件。 ,并且使用fbs,但我始终会收到相同的错误消息:(
答案 0 :(得分:1)
我用猴子补丁解决了这个问题。只需将此代码粘贴到在破折号之前导入的模块中,就可以了。在我的情况下,我有flask-compress == 1.5.0,所以我只是对版本进行了硬编码,但您可能可以做一些更聪明的事情。
"""
Simple module that monkey patches pkg_resources.get_distribution used by dash
to determine the version of Flask-Compress which is not available with a
flask_compress.__version__ attribute. Known to work with dash==1.16.3 and
PyInstaller==3.6.
"""
import sys
from collections import namedtuple
import pkg_resources
IS_FROZEN = hasattr(sys, '_MEIPASS')
# backup true function
_true_get_distribution = pkg_resources.get_distribution
# create small placeholder for the dash call
# _flask_compress_version = parse_version(get_distribution("flask-compress").version)
_Dist = namedtuple('_Dist', ['version'])
def _get_distribution(dist):
if IS_FROZEN and dist == 'flask-compress':
return _Dist('1.5.0')
else:
return _true_get_distribution(dist)
# monkey patch the function so it can work once frozen and pkg_resources is of
# no help
pkg_resources.get_distribution = _get_distribution
答案 1 :(得分:0)
monkey-patching solution显然是更可取的,这是因为它保留了烧瓶代码完整(显然是原始功能),而且还因为(大概)确定了真正的潜在问题-flask-compress < strong>是 随身携带的,但是pkg_resources根本无法检测到...我想知道可以做些什么(如果有的话)来概括这一点-可能可以修改pkg_resources在“捆绑的” Pyinstaller上下文中工作。
我遇到了完全相同的问题。现在,“正确”的事情是弄清楚添加适当的Pyinstaller hook来解决此问题的明显方法。也许我会在某个时候开始这样做-当然,您尝试做的事情是有道理的,应该已经奏效了。我做了更基本的动作,即在主python脚本中显式导入flask_compress,但没有成功。
但是,由于我们都在尝试Pyinstallerize依赖于烧瓶的(桌面)应用程序,因此,我们两个人实际上都不需要gzip生成的响应的机会非常好,因此可以通过以下方法消除整个问题: “稍微简化了软件”。在我的情况下,对flask_compress的引用来自dash,因此我删除了gzip功能(位于Lib/site-packages/dash/dash.py
中)。关键的相关参考资料位于第21,53,292,321和432行。
像这样的“重新布线”引用(在您使用的任何引用flask-compress的库中)都神奇地消失了-对我有用:-)
我敢打赌,53行使用的机器对Pyinstaller来说太聪明/太动态了。不要误会我的意思-Pyinstaller简直就是个奇迹,但是作为一个社区,我们将永远努力尝试插入这些聪明的技巧,因为Python并不是专门用来生成漂亮的独立可执行文件的。
答案 2 :(得分:0)
我遇到了类似的问题,并且在具有pyinstaller==4.0
,dash==1.17.0
和flask_compress==1.8.0
的环境中,该解决方案不适用于我。
但是,我发现Legorooj here提出的解决方案在我的情况下效果很好,基本上是在钩子文件中使用tensorflow
和flask
来代替flask_compress
。
为完整起见,这是我编写hook-flask.py
文件的方式。
from PyInstaller.utils.hooks import collect_all
def hook(hook_api):
packages = [
'flask',
'flask_compress',
'flask_caching'
]
for package in packages:
datas, binaries, hiddenimports = collect_all(package)
hook_api.add_datas(datas)
hook_api.add_binaries(binaries)
hook_api.add_imports(*hiddenimports)
这种方式不需要猴子修补。