【问题标题】:pyinstaller - 'No module named...' error with scripts importpyinstaller - \'No module named...\' 脚本导入错误
【发布时间】:2022-08-23 16:14:33
【问题描述】:

我需要通过以下方式将我的 Python 3.10 项目编译为可执行文件安装程序并且在执行 exe 文件时似乎无法让我的导入工作。

我的 \"test\" 项目结构如下所示

src/
__init__.py
app/
    __init__.py
    main.py
    main.spec
    version.rc
lib/
    core/
        __init__.py
        core_test.py
    service/
        __init__.py
        service_test.py
    __init__.py

在这个例子中,我正在构建主程序包含此代码的文件:

from src.lib.service import service_tst
from src.lib.core import core_tst

service_tst.do_something()
core_tst.do_something()

我的规格文件看起来像这样:

block_cipher = None
a = Analysis([\'main.py\'],
         pathex=[],
         binaries=[],
         datas=[],
         hiddenimports=[],
         hookspath=[],
         hooksconfig={},
         runtime_hooks=[],
         excludes=[],
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher,
         noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)

exe = EXE(pyz,
      a.scripts, 
      a.binaries,
      a.zipfiles,
      a.datas,
      [],
      name=\'main\',
      debug=False,
      bootloader_ignore_signals=False,
      strip=False,
      upx=True,
      upx_exclude=[],
      runtime_tmpdir=None,
      console=True,
      disable_windowed_traceback=False,
      target_arch=None,
      codesign_identity=None,
      entitlements_file=None,
      icon=\'\',
      version=\'version.rc\')

到目前为止,一切都很好。

现在,使用 pyinstaller 创建 exe 文件后,出现以下错误:

ModuleNotFoundError: No module named \'src\'

这是我到目前为止所做的:

添加\"源代码\"隐藏进口

hiddenimports=[\"src\"]

给了我以下错误

ModuleNotFoundError: No module named \'src.lib\'

当我同时添加两者时,源代码src.lib

hiddenimports=[\"src\", \"src.lib\"],

我仍然得到

ModuleNotFoundError: No module named \'src.lib\'

当我使用收集子模块像这样:

src_hidden_import = collect_submodules(\'src\')
a = Analysis([\'main.py\'],
         pathex=[],
         binaries=[],
         datas=[],
         hiddenimports=src_hidden_import,
         ...

我得到以下错误

ModuleNotFoundError: No module named \'src.lib\'

\"real\" 项目显然包含很多导入,都以 src. 开头,所以我需要 pyinstaller 来抓取我的整个项目/文件结构并将所有使用的脚本打包到可执行文件中。

我在这里想念什么?

  • app/__init__.py 中有什么内容?
  • 在里面.py 都是空的。只是为了标记模块

标签: python module pyinstaller git-submodules


【解决方案1】:

根据pyinstaller documentation,您可以使用选项-p DIR--paths DIR 来定义搜索导入的其他路径:

-p 目录,--paths 目录: 搜索导入的路径(例如使用 PYTHONPATH)。允许多个路径,用':'分隔,或多次使用此选项。等效于在 spec 文件中提供 pathex 参数。

尝试将您的项目路径添加到您的规范文件中的pathex。您可以通过普通(相对或绝对)路径(即pathex=["<your-project-path>"]pathex=["."])或通过Globals Available to the Spec File(即指向您的规范文件位置的pathex=[SPECPATH])来执行此操作。

然后 pyinstaller 将在这些附加位置中搜索您的导入和模块。

这是我将SPECPATH 添加到pathex 的规范文件示例:

block_cipher = None
a = Analysis(['main.py'],
         pathex=[SPECPATH],
         binaries=[],
         datas=[],
         hiddenimports=[],
         hookspath=[],
         hooksconfig={},
         runtime_hooks=[],
         excludes=[],
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher,
         noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)

【讨论】:

    猜你喜欢
    • 2015-04-30
    • 2016-10-31
    • 1970-01-01
    • 2020-02-06
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多