繁体   English   中英

pyinstaller - 'No module named...' 脚本导入错误

[英]pyinstaller - 'No module named...' error with scripts import

我需要通过pyinstaller将我的 Python 3.10 项目编译为可执行文件,并且在执行 exe 文件时似乎无法让我的导入工作。

我的“测试”项目结构如下所示

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

在此示例中,我正在构建包含以下代码的main.exe文件:

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'

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

“src”添加到hiddenimports

hiddenimports=["src"]

给我以下错误

ModuleNotFoundError: No module named 'src.lib'

当我同时添加srcsrc.lib

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

我仍然得到

ModuleNotFoundError: No module named 'src.lib'

当我像这样使用collect_submodules时:

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

我收到以下错误

ModuleNotFoundError: No module named 'src.lib'

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

我在这里想念什么?

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

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

尝试将您的项目路径添加到您的规范文件中的pathex 您可以通过普通(相对或绝对)路径(即pathex=["<your-project-path>"]pathex=["."] )或通过Spec File 可用的全局变量(即pathex=[SPECPATH]指向您的规范文件的位置)。

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

这是我将SPECPATH添加到pathex的 specfile 示例:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM