PyInstaller 文件无法执行脚本 - DistributionNotFound
PyInstaller file fails to execute script - DistributionNotFound
我正在尝试使用 PyInstaller 将我的 python 文件转换为可执行文件。该程序使用 Google Cloud Translate API 到 t运行 在语言之间给定文本。当在终端中 运行ning 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 客户端模块而你只需要做 pip install facebook-sdk
和 PyInstaller 运行 制作的可执行文件没有问题。
如果您想检查我的程序中使用的代码,it's hosted on my GitHub。
感谢所有帮助我的人!
我个人的解决方案:
- 将所有对 get_distribution 的调用更改为返回值(在我的例子中为 0.21.0)
- 从导入中删除
from pkg_resources import get_distribution
对于包中的所有文件。
根据我在 https://github.com/GoogleCloudPlatform/google-cloud-python/issues/1187 中的帮助的经验:
- 转到\Anaconda3\Lib\site-packages\PyInstaller\hooks文件夹(如果你使用anaconda,否则你需要在python文件夹下找到它)
- 找到钩子-google-cloud.py(如果存在,否则需要创建钩子。
- 写入现有代码如下图
'''
Copyright (c) 2017, PyInstaller Development Team.
Distributed under the terms of the GNU General Public License with exception
for distributing bootloader.
The full license is in the file COPYING.txt, distributed with this software.
'''
from PyInstaller.utils.hooks import copy_metadata
datas = copy_metadata('google-cloud-core')
datas += copy_metadata('google-cloud-translate')
datas += copy_metadata('google-api-core')
希望此说明对您有所帮助。谢谢。
基本上是包构建名称问题。 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')
我遇到了完全相同的问题。我通过这样做解决了它:
- 转到 Pyinstaller 挂钩文件夹 (~\Lib\site-packages\PyInstaller\hooks)
- 找到文件hook-google.cloud.py,打开,在里面添加如下代码
datas += copy_metadata('google-cloud-translate')
datas += copy_metadata('google-api-core')
问题似乎是 get_distribution 无法使用默认的 google.cloud.translate 挂钩,所以我只是将其添加到一个正常工作的挂钩中。
希望这对某人有所帮助。
备用挂钩调整
我 运行 遇到了与 Google 语音引擎相同的基本问题。
奇怪的是这里的每个人似乎都通过稍微不同的解决方案取得了成功。我真的不明白保留 copy_metadata('google-cloud-core')
的挂钩“补丁”如何工作?返回的错误显示为 The 'google-cloud-core' distribution was not found...
,那么如何按原样执行该行?
这是我对 hook-google.cloud.py 文件内容的 替换,以便使用 google 演讲:
# 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')
我在我的项目中使用 PyCharm venv,唯一对我有用的解决方案是将项目更改为系统解释器(并为其安装所需的包)。
今天,当我试图从我的 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
文件没有问题。
我正在尝试使用 PyInstaller 将我的 python 文件转换为可执行文件。该程序使用 Google Cloud Translate API 到 t运行 在语言之间给定文本。当在终端中 运行ning 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 客户端模块而你只需要做 pip install facebook-sdk
和 PyInstaller 运行 制作的可执行文件没有问题。
如果您想检查我的程序中使用的代码,it's hosted on my GitHub。
感谢所有帮助我的人!
我个人的解决方案:
- 将所有对 get_distribution 的调用更改为返回值(在我的例子中为 0.21.0)
- 从导入中删除
from pkg_resources import get_distribution
对于包中的所有文件。
根据我在 https://github.com/GoogleCloudPlatform/google-cloud-python/issues/1187 中的帮助的经验:
- 转到\Anaconda3\Lib\site-packages\PyInstaller\hooks文件夹(如果你使用anaconda,否则你需要在python文件夹下找到它)
- 找到钩子-google-cloud.py(如果存在,否则需要创建钩子。
- 写入现有代码如下图
''' Copyright (c) 2017, PyInstaller Development Team. Distributed under the terms of the GNU General Public License with exception for distributing bootloader. The full license is in the file COPYING.txt, distributed with this software. ''' from PyInstaller.utils.hooks import copy_metadata datas = copy_metadata('google-cloud-core') datas += copy_metadata('google-cloud-translate') datas += copy_metadata('google-api-core')
希望此说明对您有所帮助。谢谢。
基本上是包构建名称问题。 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')
我遇到了完全相同的问题。我通过这样做解决了它:
- 转到 Pyinstaller 挂钩文件夹 (~\Lib\site-packages\PyInstaller\hooks)
- 找到文件hook-google.cloud.py,打开,在里面添加如下代码
datas += copy_metadata('google-cloud-translate')
datas += copy_metadata('google-api-core')
问题似乎是 get_distribution 无法使用默认的 google.cloud.translate 挂钩,所以我只是将其添加到一个正常工作的挂钩中。
希望这对某人有所帮助。
备用挂钩调整
我 运行 遇到了与 Google 语音引擎相同的基本问题。
奇怪的是这里的每个人似乎都通过稍微不同的解决方案取得了成功。我真的不明白保留 copy_metadata('google-cloud-core')
的挂钩“补丁”如何工作?返回的错误显示为 The 'google-cloud-core' distribution was not found...
,那么如何按原样执行该行?
这是我对 hook-google.cloud.py 文件内容的 替换,以便使用 google 演讲:
# 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')
我在我的项目中使用 PyCharm venv,唯一对我有用的解决方案是将项目更改为系统解释器(并为其安装所需的包)。
今天,当我试图从我的 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
文件没有问题。