【问题标题】:cx_Freeze "ImportError: cannot import name 'vision"cx_Freeze "ImportError: cannot import name 'vision"
【发布时间】:2020-03-10 15:36:48
【问题描述】:

我正在尝试冻结的 Python 脚本中使用 TensorFlow。一切都很好,但是当我尝试运行它时,我收到了这个错误:

Traceback (most recent call last):
File "C:\Users\.conda\envs\lib\site-packages\cx_Freeze\initscripts__startup__.py", line 14, in run module.run()
File "C:\Users\.conda\envs\lib\site-packages\cx_Freeze\initscripts\Console.py", line 26, in run exec(code, m.dict)
File "config.py", line 21, in
File "E:\Projects\test.py", line 7, in from google.cloud import vision
ImportError: cannot import name 'vision'

我正在使用 cx_Freeze。 google 库已成功添加到Setup.py 脚本中。 __init__.py 也存在于 google 目录中。

Setup.py:

from cx_Freeze import setup, Executable
import sys
import os

base = None
os.environ['TCL_LIBRARY'] = "C:\\ProgramData\\Anaconda3\\tcl\\tcl8.6"
os.environ['TK_LIBRARY'] = "C:\\ProgramData\\Anaconda3\\tcl\\tk8.6"
os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(os.getcwd(), "cacert.pem")

if sys.platform == 'win32':
    # base = "Win32GUI"
    base = 'Console'

if sys.platform == 'win64':
    # base = "Win64GUI"
    base = 'Console'

include = ['numpy.core._methods', 'numpy.lib.format', 'jinja2', 'jinja2.ext', 'asyncio', 'constants', 'jinja2.debug']

packages = ['asyncio', 'jinja2', 'jinja2.ext', 'flask', 'numpy', 'pandas', 'connect_db', 'pymysql', 'pymysql.cursors',
            'multiprocessing', 'multiprocessing.pool','google']
excludes = []

options = {'build_exe': {'packages': packages, 'includes': include, 'include_files': includefiles, 'excludes': excludes}}

flaskapp = Executable(script="config.py",
                      targetName="test.exe",
                      icon='test.ico'
                      )

setup(
    name="",
    version="1.0",
    author="Test",
    description="Test",
    options={
        'build_exe': {
            'include_files': includefiles,
            'includes': include,
            'packages': packages,
            'excludes': excludes,
            'build_exe': "build"
        }
    },
    executables=[flaskapp]
)

提前谢谢你

【问题讨论】:

    标签: python-3.x cx-freeze


    【解决方案1】:

    根据 GitHub 存储库,google/cloud/__init__.py 包含以下代码:

    try:
        import pkg_resources
    
        pkg_resources.declare_namespace(__name__)
    except ImportError:
        import pkgutil
    
        __path__ = pkgutil.extend_path(__path__, __name__)
    

    cx_Freeze 可能无法识别此动态导入。尝试将'pkg_resources''pkgutil' 添加到安装脚本中的'packages' 列表中。

    编辑:

    google-cloud-vision 与 pip 一起安装时,path_to_python_lib/site-packages/google/cloud/ 目录中也缺少 __init__.py 文件。尝试在冻结之前手动将一个空的__init__.py 文件添加到此目录。

    【讨论】:

    • 我试过你的答案,还是一样的错误,我在问题中添加了错误
    • @A14 我发现了另一个潜在问题并相应地编辑了我的答案。
    • 我应该在哪个文件夹中添加,因为文件夹是/site-packages/google/vision_v1
    • @A14 在我的安装中,文件夹是site-packages/google/cloud/vision_v1 等等,而__init__.py 文件在site-packages/google/cloud/ 中丢失(对不起,我的回答有误,现在更正)。
    【解决方案2】:

    谢谢@jpeg 我终于找到了解决办法。

    1. 我在/site-packages/google/site-packages/google/cloud 中添加了__init__.py
    2. 对于错误:DistributionNotFound: The 'google-api-core' distribution was not found and is required by the application 编辑了/site-packages/google/api_core/__init__.py
    import requests_toolbelt.adapters.appengine
    requests_toolbelt.adapters.appengine.monkeypatch()
    import pkg_resources
    old_get_distribution = pkg_resources.get_distribution
    from pkg_resources import parse_version
    
    def mp_get_distribution(*args, **kwargs):
        # print args
        # print kwargs
        try:
            res = old_get_distribution(*args, **kwargs)
        except:
            class Mock(object):
                pass
    
            mock = Mock()
            mock.parsed_version = parse_version("2.6.1") #add sensible value
            mock.version = parse_version("2.6.1") #add sensible value
            return mock
    
        return res
    
    pkg_resources.get_distribution = mp_get_distribution
    
    from google import api_core
    

    【讨论】:

      【解决方案3】:

      我不得不修改A14提出的解决方案如下。

      1. 在 /site-packages/google 中添加 init.py 也在 /site-packages/google/cloud 中(相同)
      2. init.py 中 /site-packages/pkg_ressources 在导入后添加这一行

        from pkg_resources import py2_warn
        
      3. 对于错误:DistributionNotFound:未找到“google-api-core”分发,应用程序需要编辑 /site-packages/google/api_core/init.py

         import pkg_resources
         old_get_distribution = pkg_resources.get_distribution
         from pkg_resources import parse_version
        
         def mp_get_distribution(*args, **kwargs):
             # print args
             # print kwargs
             try:
                 res = old_get_distribution(*args, **kwargs)
             except:
                 class Mock(object):
                    pass
        
                  mock = Mock()
                  mock.parsed_version = parse_version("1.16.0") #add sensible value
                  mock.version = parse_version("1.16.0") #add sensible value
                  return mock
        
             return res
        
        pkg_resources.get_distribution = mp_get_distribution
        
        from google import api_core
        

      【讨论】:

        猜你喜欢
        • 2013-04-21
        • 1970-01-01
        • 2019-07-20
        • 2016-05-16
        • 2018-10-27
        • 2020-07-16
        • 2019-06-10
        • 2014-09-25
        • 2014-01-02
        相关资源
        最近更新 更多