【问题标题】:ImportError: cannot import name packagesImportError:无法导入名称包
【发布时间】:2023-04-08 00:02:01
【问题描述】:

我正在使用 cx_Freeze 版本 5.1.1,并且我有一个 python 2.7.9 应用程序可以使用 cx_Freeze 进行打包。应用程序正在使用 python 'requests' 模块(请求的版本是 2.18.4)

这是我的 cx_Freeze setup.py 文件(注意我特意在要包含的包中包含“请求”):

from cx_Freeze import setup, Executable
import sys

from cx_Freeze import setup, Executable

packages_to_include =['lib','lib/DB','encodings.ascii','requests']

buildOptions = dict(
    optimize=1,
    excludes = ['tkinter'],
    bin_includes = [
        'libcrypto.so.1.0.0',
        'libcrypto.so.10',
        'libgssapi_krb5.so.2',
        'libk5crypto.so.3',
        'libkeyutils.so.1',
        'libssl.so.1.0.1e',
        'libssl.so.10'
    ],
    includes = packages_to_include,
    packages= ['urllib3','idna']
)

executables = [
    Executable(
        'workapp.py',
        targetName = 'workapp'
    )
]

setup(
    name='Sample Flask App',
    version = '0.1',
    description = 'Sample Flask App',
    #requires = ["requests"],
    options = dict(build_exe = buildOptions),
    executables = executables
)

构建已成功创建可执行文件,但在运行我的应用程序时出现以下错误:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/cx_Freeze/initscripts/__startup__.py", line 14, in run
    module.run()
  File "/usr/local/lib/python2.7/site-packages/cx_Freeze/initscripts/Console.py", line 26, in run
    exec(code, m.__dict__)
  File "vaas.py", line 2, in <module>
    import requests
  File "/usr/local/lib/python2.7/site-packages/requests/__init__.py", line 113, in <module>
    from . import packages
ImportError: cannot import name packages

我认为这是我的 cx_Freeze 设置或请求的问题,但由于我告诉 cx_Freeze 包含“请求”,这应该可以工作。 我检查了构建目录(cx_Freeze 构建请求模块定义了“包”,我可以找到它:

[user@centos-vm]$ ls build/exe.linux-x86_64-2.7/lib/requests/packages/
chardet  idna  urllib3

非常感谢任何帮助!

【问题讨论】:

    标签: python python-requests cx-freeze python-packaging


    【解决方案1】:

    找到解决此问题的方法:

    编辑:

    /usr/local/lib/python2.7/site-packages/requests/__init__.py
    

    并注释掉:

    from . import packages
    

    确实很奇怪的问题。我的解冻应用程序运行良好,但使用 cx_freeze 时需要上述解决方法。

    【讨论】:

      【解决方案2】:

      尝试将'request' 添加到packages 列表选项中,而不是将其添加到includes 列表选项中:

      packages= ['urllib3', 'idna', 'requests']
      

      根据cx_Freezedocumentationbuild_exe 选项includes 是一个

      要包含的模块名称的逗号分隔列表

      build_exe 选项 packages 是一个

      要包含的包的逗号分隔列表,其中包括包中的所有子模块

      【讨论】:

      • 这是我在包中添加“请求”时得到的:文件“/usr/local/lib/python2.7/site-packages/cx_Freeze/finder.py”,第 282 行,在 _ImportAllSubModules 中引发 ImportError("No module named %r" % subModuleName) ImportError: No module named 'requests.packages'
      • 这对我来说看起来很奇怪...您的解冻应用程序实际上运行时没有错误吗? python 安装的requests/packages 文件夹中是否有__init__.py 文件?
      • 嗯,好像有 init.pyo 存在,但没有 init.py: ls /usr/local/lib/python2.7/站点包/请求/包 chardet idna init.pyo urllib3
      • 我实际上找到了一个解决方法,我把它作为答案。非常感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 2016-03-31
      • 2014-10-10
      • 2014-09-20
      • 2014-08-28
      • 2014-06-10
      • 2016-05-16
      相关资源
      最近更新 更多