PyInstaller文件无法执行脚本 - DistributionNotFound

时间:2016-10-16 23:59:11

标签: python pyinstaller google-translate

我试图使用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

感谢有人帮助我!

7 个答案:

答案 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中的帮助为基础:

  1. 转到\ Anaconda3 \ Lib \ site-packages \ PyInstaller \ hooks文件夹(如果使用anaconda,否则需要在python文件夹下找到它)
  2. 找到hook-google-cloud.py(如果存在,则需要创建该钩子。
  3. 写入现有代码,如下所示


    版权(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:

  1. Change all calls to get_distribution with it returned values (0.21.0 in my case)
  2. Remove 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)

我遇到了完全相同的问题。我通过这样做解决了这个问题:

  1. 转到Pyinstaller挂钩文件夹(〜\ Lib \ site-packages \ PyInstaller \ hooks)
  2. 找到文件hook-google.cloud.py,打开它,然后将以下代码添加到其中
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 文件没有问题。