我试图使用PyInstaller将我的python文件转换为可执行文件。该程序使用Google Cloud Translate API在语言之间翻译给定的文本。在终端中运行python quicktrans.py
时,程序运行正常。然后我运行pyinstaller quicktrans.py
,SHIFT +右键单击可执行文件所在的目录,并在终端中运行.exe文件。这是它吐出的回溯(注意这不是整个回溯,因为它有点冗长):
File "c:\users\kalab\realpython\quicktrans\google\cloud\connection.py", line 31, in <module>
get_distribution('google-cloud-core').version)
File "site-packages\pkg_resources\__init__.py", line 559, in get_distribution
File "site-packages\pkg_resources\__init__.py", line 433, in get_provider
File "site-packages\pkg_resources\__init__.py", line 970, in require
File "site-packages\pkg_resources\__init__.py", line 856, in resolve
pkg_resources.DistributionNotFound: The 'google-cloud-core' distribution was not found and is required by the application
Failed to execute script quicktrans
我试过调查这个以及它给我一个类似pip的错误的原因。我一直试图解决这个问题几个小时而没有运气。
注意:要按照documentation安装其客户端库,您必须运行pip install --upgrade google-cloud-translate
我认为这可能有某事与此有关,因为我使用的最后一个应用程序处理了Facebook客户端模块而你只需做{{1}并且PyInstaller生成的可执行文件没有任何问题。
如果您想检查我的程序中使用的代码it's hosted on my GitHub。
感谢有人帮助我!
答案 0 :(得分:3)
这基本上是软件包建筑物名称的问题。 Pyinstaller尝试导入
google.cloud
现在称为Google云程序包的地方
gcloud
。因此,您需要为该名称创建一个挂钩文件
C:\ Users \\ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ site-packages \ PyInstaller \ hooks \ hook-gcloud.py
文件内容:
from PyInstaller.utils.hooks import copy_metadata
datas = copy_metadata('gcloud')
答案 1 :(得分:2)
以我在https://github.com/GoogleCloudPlatform/google-cloud-python/issues/1187中的帮助为基础:
写入现有代码,如下所示
版权(c)2017,PyInstaller开发团队。
根据GNU通用公共许可证的条款分发,例外情况 用于分发引导程序。
完整许可位于此软件分发的COPYING.txt文件中。
从PyInstaller.utils.hooks导入copy_metadata
datas = copy_metadata('google-cloud-core')
数据+ = copy_metadata('google-cloud-translate')
数据+ = copy_metadata('google-api-core')
希望此说明对您有所帮助。谢谢。
答案 2 :(得分:1)
My personal solution:
from pkg_resources import get_distribution
from import for all files in the package.
答案 3 :(得分:1)
我在使用Google语音引擎时遇到了同样的基本问题。
奇怪的是,这里的每个人似乎都有成功的解决方案。我真的不明白如何将copy_metadata('google-cloud-core')
保留在钩子上的“补丁”如何工作?抛出的错误读为The 'google-cloud-core' distribution was not found...
,那么一个人怎么能照原样执行该行呢?
这是我对 hook-google.cloud.py 的文件内容的替换,以便使用Google语音构建exe:
# PATCH: PROVIDED ALTERNATE PACKAGE NAME
from PyInstaller.utils.hooks import copy_metadata
try: datas = copy_metadata('google-cloud-core')
except: datas = copy_metadata('google-cloud-speech')
答案 4 :(得分:0)
我遇到了完全相同的问题。我通过这样做解决了这个问题:
datas += copy_metadata('google-cloud-translate')
datas += copy_metadata('google-api-core')
问题似乎是get_distribution不适用于默认的google.cloud.translate挂钩,因此我只是将其添加到了可以正常使用的挂钩中。
希望这对某人有帮助。
答案 5 :(得分:0)
我在我的项目中使用了 PyCharm venv,唯一对我有用的解决方案是将项目更改为系统解释器(并安装所需的包)。
答案 6 :(得分:0)
今天,当我试图用我的 Python 脚本构建一个 EXE 时,我遇到了同样的错误:
pkg_resources.DistributionNotFound: The 'google-cloud-core' distribution was not found and is required by the application
我认为原因是该线程中列出的原因之一,因为我确信我已使用 pipenv
安装了所有依赖项,因为我的代码已编译并且我可以毫无问题地调试和运行代码。请注意,我在一个空文件夹中使用了 pipenv shell
并在其中创建了我的应用程序,使用 pipenv install ...
安装了所有必要的库,其中一个库是 google-cloud-dialogflow
(该应用程序是一个聊天机器人管理器)。
解决方案只是运行 pipenv install google-cloud-core
。
现在,pyinstaller chatbot_manager.py --onefile --windowed
创建的 c:\Users\...\dist\chatbot_manager.exe
文件没有问题。