如何解决Pyinstaller模块未找到错误

时间:2020-08-07 12:19:42

标签: python pyinstaller streamlit modulenotfounderror

我正在尝试使用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")) models软件包,也可以导入它们,只是为了确保pyinstaller能够解决依赖关系,因为我使用子进程来运行应用程序。但是尽管如此,在构建并运行可执行文件后,我仍然得到stapp。此错误来自ModuleNotFoundError: No module named 'models',其中导入了stapp.main。我尝试将modelsmodels都添加到stapp都没有成功。我认为,由于项目根目录已添加到PYTHONPATH,因此本地包应该没有任何问题。即使出于某些原因,导入和隐藏导入也应处理该问题。这是我当前的规格文件:

hiddenimports

我将非常感谢您如何使pyinstaller包含项目的本地软件包的任何帮助。谢谢!

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分:0)

问题恰恰是所显示的。您需要为模型扩展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')