【问题标题】:PyInstaller file fails to execute script - DistributionNotFoundPyInstaller 文件无法执行脚本 - DistributionNotFound
【发布时间】:2017-02-25 20:54:22
【问题描述】:

我正在尝试使用 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

我已尝试对此进行调查,并且出于某种原因它给了我一个类似点子的错误。我一直在尝试解决这个问题几个小时,但没有运气。 注意:要安装其客户端库,按照documentation,您必须运行pip install --upgrade google-cloud-translate

我认为这可能与 某些事情有关,因为我使用的最后一个应用程序处理 Facebook 客户端模块,而您只需执行 pip install facebook-sdk 并且 PyInstaller 生成的可执行文件运行没有问题。

如果你想检查我在我的程序中使用的代码,it's hosted on my GitHub

感谢任何在这里帮助我的人!

【问题讨论】:

    标签: python pyinstaller google-translate


    【解决方案1】:

    我的个人解决方案:

    1. 将所有对 get_distribution 的调用更改为返回值(在我的情况下为 0.21.0)
    2. 从导入中删除 from pkg_resources import get_distribution

    对于包中的所有文件。

    【讨论】:

    • 请尽量让你的答案有深度和清晰。
    • 一个谦虚的请求,看看其他答案,自己看看。
    【解决方案2】:

    根据我的经验,基于https://github.com/GoogleCloudPlatform/google-cloud-python/issues/1187 中的帮助:

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

    希望此说明对您有所帮助。谢谢。

    【讨论】:

      【解决方案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')
      

      【讨论】:

      • 我不了解你们,但我只是做了一个 pip install pip install google-cloud-core 我想是因为已经有更新了。成功了!
      【解决方案4】:

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

      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】:

        备用挂钩调整

        我在使用 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')
        

        【讨论】:

          【解决方案6】:

          我在我的项目中使用 PyCharm venv,唯一对我有用的解决方案是将项目更改为系统解释器(并安装所需的包)。

          【讨论】:

            【解决方案7】:

            今天,当我尝试使用 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 文件没有问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-08-03
              • 2021-05-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-30
              • 2021-02-14
              • 1970-01-01
              相关资源
              最近更新 更多