【问题标题】:How to resolve Pyinstaller module not found error如何解决 Pyinstaller 模块未找到错误
【发布时间】:2020-11-27 18:54:47
【问题描述】:

我正在尝试使用 Pyinstaller 将我的项目打包成可执行文件。目前,我正在基于 Ubuntu 的 PC 上进行概念验证,之后我计划切换到 Windows 以构建可以在 Windows 上运行的 .exe。问题是,在我构建可执行文件并运行它之后,它找不到在启动文件中导入的本地包之一。这是我的项目结构:

.
├── hook-streamlit.py
├── __init__.py
├── models
│   ├── __init__.py
│   ├── loader.py
│   ├── nn.py
│   └── runner.py
├── notebooks
├── README.md
├── requirements.txt
├── stapp
│   ├── __init__.py
│   ├── main.py
│   └── session_state.py
├── startup.py
├── startup.spec
├── test_data
│   ├── test_x.csv
│   ├── test_y.csv
│   ├── train_x.csv
│   └── train_y.csv
├── tkapp.py
├── unipredictor-icon.ico
├── UniPredictor.spec
└── utils.py

startup.py是启动脚本,内容如下:

import os
import subprocess
import shlex

from models import nn, loader, runner
from stapp import main

subprocess.call(shlex.split(f"streamlit run {os.path.join('stapp', 'main.py')} --global.developmentMode=false"))

即使我不需要启动脚本中的modelsstapp 包,我还是导入它们,只是为了确保pyinstaller 解决依赖关系,因为我使用子进程运行应用程序。但即便如此,在构建并运行可执行文件后,我仍然会得到ModuleNotFoundError: No module named 'models'。此错误来自 stapp.main,其中导入了 models。我尝试将modelsstapp 添加到hiddenimports 都没有成功。我认为由于项目根目录已添加到 PYTHONPATH,因此本地包应该没有任何问题。即使由于某种原因确实如此,导入和隐藏导入也应该处理这个问题。这是我当前的规范文件:

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['startup.py'],
             pathex=['/home/kenneth/PycharmProjects/universal_predictor'],
             binaries=[],
             datas=[],
             hiddenimports=['models', 'stapp'],
             hookspath=['.'],
             runtime_hooks=[],
             excludes=['torch.distributions'],
             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='startup',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False , icon='unipredictor-icon.ico')

对于如何使 pyinstaller 包含项目的本地包的任何帮助,我将不胜感激。谢谢!

【问题讨论】:

    标签: python pyinstaller streamlit modulenotfounderror


    【解决方案1】:

    我通过加载所需的包和模块作为数据解决了这个问题。

    # -*- mode: python ; coding: utf-8 -*-
    
    block_cipher = None
    
    
    a = Analysis(['startup.py'],
                 pathex=['/home/kenneth/PycharmProjects/universal_predictor'],
                 binaries=[],
                  datas=[('.streamlit', '.streamlit'), ('.data', '.data'), ('models', 'models'), ('stapp', 'stapp'), ('utils.py', '.')],
                 hiddenimports=[],
                 hookspath=['.'],
                 runtime_hooks=[],
                 excludes=['torch.distributions'],
                 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='startup',
              debug=False,
              bootloader_ignore_signals=False,
              strip=False,
              upx=True,
              upx_exclude=[],
              runtime_tmpdir=None,
              console=False , icon='unipredictor-icon.ico')
    

    【讨论】:

      【解决方案2】:

      问题正是显示的内容。您需要为模型扩展 PYTHONPATH。在您的规范文件中添加模型的包路径。

      # -*- mode: python ; coding: utf-8 -*-
      
      block_cipher = None
      
      
      a = Analysis(['startup.py'],
                   pathex=['/home/kenneth/PycharmProjects/universal_predictor', 
      '/home/kenneth/PycharmProjects/universal_predictor/models'],
                   binaries=[],
                   datas=[],
                   hiddenimports=['models', 'stapp'],
                   hookspath=['.'],
                   runtime_hooks=[],
                   excludes=['torch.distributions'],
                   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='startup',
                debug=False,
                bootloader_ignore_signals=False,
                strip=False,
                upx=True,
                upx_exclude=[],
                runtime_tmpdir=None,
                console=False , icon='unipredictor-icon.ico')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        • 1970-01-01
        • 1970-01-01
        • 2021-04-08
        • 2020-11-01
        相关资源
        最近更新 更多