找不到'google-api-python-client'分发,使用pyinstaller的应用程序需要该分发

时间:2020-04-29 20:16:40

标签: python pyinstaller google-api-python-client

我目前正在尝试使用pyinstaller构建应用。我遇到了错误The 'google-api-python-client' distribution was not found and is required by the application,但我完全不知道为什么。

运行pip show google-api-python-client的结果

Name: google-api-python-client
Version: 1.8.2
Summary: Google API Client Library for Python
Home-page: http://github.com/google/google-api-python-client/
Author: Google LLC
Author-email: googleapis-packages@google.com
License: Apache 2.0
Location: c:\dev\software\schoology_scrape\schoology_scrape_venv\lib\site-packages
Requires: google-auth-httplib2, uritemplate, google-auth, google-api-core, httplib2, six
Required-by:

我还有一个require.txt文件,其中包含项目中使用的所有库

任何帮助将不胜感激!

7 个答案:

答案 0 :(得分:4)

从字面上看,只是在Windows上遇到了这个问题,而macOS可以。我正在使用fbsPyQt5进行构建。

问题

google-api-python-client不是python模块,而是资源,这意味着您不能将其作为隐藏导入注入。 googleapiclient.modelgoogle-api-python-client文件夹中读取分发信息作为打包资源。

您的完整错误可能看起来更接近此:

...
File "c:\python36\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\googleapiclient\http.py", line 67, in <module>
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "c:\python36\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\googleapiclient\model.py", line 36, in <module>
  File "site-packages\pkg_resources\__init__.py", line 479, in get_distribution
  File "site-packages\pkg_resources\__init__.py", line 355, in get_provider
  File "site-packages\pkg_resources\__init__.py", line 898, in require
  File "site-packages\pkg_resources\__init__.py", line 784, in resolve
pkg_resources.DistributionNotFound: The 'google-api-python-client' distribution was not found and is required by the application


解决方案1 ​​–如果使用fbs或其他通用包装框架

  1. 找到google_api_python_client-*/
    • 可能在<pythonInstallLocation>/lib/site-packages/的某个地方
  2. google_api_python_client-*/复制到应用程序的src资源目录中。对于fbs,它可以是:
    • src/freeze/windows/(推荐),或
    • src/resources/windows/

现在,当您fbs freeze,随后fbs installer您的应用程序时,google_api_python_client-*/将与其他googleapiclient python库一起被包含在已构建应用程序的目录中,并且错误应该消失了离开。

See: fbs project directory structure

解决方案2-无自动包装钩(未经测试):

如果您的包装解决方案没有上述类似的挂钩,则:

  1. 构建您的应用
  2. google_api_python_client-*/文件夹从<pythonInstallLocation>/lib/site-packages/手动复制到内置应用程序的目录中(或您编译的python脚本尝试访问google-api-python-client的任何位置。
  3. 尝试启动该应用

答案 1 :(得分:2)

我能够在Link

处找到解决方案

将您的google-api-python-client版本更新为链接中指定的版本(对我有用)

还制作了一个.bat小文件:

pyinstaller --hidden-import="pkg_resources.py2_warn" --hidden-import="googleapiclient" --hidden-import="apiclient"  main.py --onefile

还要注意:我在虚拟环境中运行了bat文件。

答案 2 :(得分:1)

将 Google 目录从 Python 应用程序安装位置的 Python//Lib/site-packages 目录复制到 pyinstaller 创建的 dist/ 目录。

答案 3 :(得分:0)

确保pip链接到pip3(Python 3),而不是pip2(Python2)。在许多操作系统和发行版上,情况仍然如此。

检查是否可以解决您的问题:

python3 -m pip install --upgrade google-api-python-client

如果确实如此,则将别名添加到您的.bashrc中,该别名将pip链接到pip3而不是pip2。

例如

echo "alias pip='pip3'" >> ~/.bashrc

答案 4 :(得分:0)

如果您使用PyCharm进行编码,请执行以下操作:

  1. 在终端上运行$ pip3 freeze
  2. 在项目文件夹中创建文件“ requirements.txt”
  3. 将第一步的结果复制到“ requirements.txt”中
  4. PyCharm将显示​​以下消息:/ venv中安装的软件包不满足“ requirements.txt”。点击“安装软件包”按钮,等待所有软件包安装完毕,然后再次构建您的应用。

答案 5 :(得分:0)

只想添加到@joeyipanimation答案中,因为它可以帮助我在下班后解决问题。在exe文件夹或libary区域中搜索google_api_python_client-1.9.3.dist-info,并将其复制到exe所在的主文件夹中。

答案 6 :(得分:0)

我的案例是使用.spec文件与Pyinstaller --onefile选项捆绑在一起的Python-Flask Windows应用程序。

我已经将文件夹google_api_python_client-1.9.3.dist-info从原始位置(可能是Windows site-packages文件夹)复制到了项目文件夹。

在Pyinstaller规范文件数据部分(app.spec)中添加以下行是解决此问题的方法。

a = Analysis(.......  

datas=[.....

('project\\google_api_python_client-1.9.3.dist-info','google_api_python_client-1.9.3.dist-info'),     

.......],