python 如何解决Pyinstaller模块找不到错误

wtlkbnrh  于 2024-01-05  发布在  Python
关注(0)|答案(3)|浏览(241)

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

  1. .
  2. ├── hook-streamlit.py
  3. ├── __init__.py
  4. ├── models
  5.    ├── __init__.py
  6.    ├── loader.py
  7.    ├── nn.py
  8.    └── runner.py
  9. ├── notebooks
  10. ├── README.md
  11. ├── requirements.txt
  12. ├── stapp
  13.    ├── __init__.py
  14.    ├── main.py
  15.    └── session_state.py
  16. ├── startup.py
  17. ├── startup.spec
  18. ├── test_data
  19.    ├── test_x.csv
  20.    ├── test_y.csv
  21.    ├── train_x.csv
  22.    └── train_y.csv
  23. ├── tkapp.py
  24. ├── unipredictor-icon.ico
  25. ├── UniPredictor.spec
  26. └── utils.py

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

  1. import os
  2. import subprocess
  3. import shlex
  4. from models import nn, loader, runner
  5. from stapp import main
  6. 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被导入。我尝试添加这两个modelsstapphiddenimports没有成功。我认为既然项目根目录被添加到PYTHONPATH,它应该不会有任何本地包的问题。即使出于某种原因,导入和hiddenimports应该处理这个问题。下面是我当前的spec文件:

  1. # -*- mode: python ; coding: utf-8 -*-
  2. block_cipher = None
  3. a = Analysis(['startup.py'],
  4. pathex=['/home/kenneth/PycharmProjects/universal_predictor'],
  5. binaries=[],
  6. datas=[],
  7. hiddenimports=['models', 'stapp'],
  8. hookspath=['.'],
  9. runtime_hooks=[],
  10. excludes=['torch.distributions'],
  11. win_no_prefer_redirects=False,
  12. win_private_assemblies=False,
  13. cipher=block_cipher,
  14. noarchive=False)
  15. pyz = PYZ(a.pure, a.zipped_data,
  16. cipher=block_cipher)
  17. exe = EXE(pyz,
  18. a.scripts,
  19. a.binaries,
  20. a.zipfiles,
  21. a.datas,
  22. [],
  23. name='startup',
  24. debug=False,
  25. bootloader_ignore_signals=False,
  26. strip=False,
  27. upx=True,
  28. upx_exclude=[],
  29. runtime_tmpdir=None,
  30. console=False , icon='unipredictor-icon.ico')


我将感谢任何关于如何使pyinstaller包括项目的本地软件包的帮助。谢谢!

qvtsj1bj

qvtsj1bj1#

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

  1. # -*- mode: python ; coding: utf-8 -*-
  2. block_cipher = None
  3. a = Analysis(['startup.py'],
  4. pathex=['/home/kenneth/PycharmProjects/universal_predictor'],
  5. binaries=[],
  6. datas=[('.streamlit', '.streamlit'), ('.data', '.data'), ('models', 'models'), ('stapp', 'stapp'), ('utils.py', '.')],
  7. hiddenimports=[],
  8. hookspath=['.'],
  9. runtime_hooks=[],
  10. excludes=['torch.distributions'],
  11. win_no_prefer_redirects=False,
  12. win_private_assemblies=False,
  13. cipher=block_cipher,
  14. noarchive=False)
  15. pyz = PYZ(a.pure, a.zipped_data,
  16. cipher=block_cipher)
  17. exe = EXE(pyz,
  18. a.scripts,
  19. a.binaries,
  20. a.zipfiles,
  21. a.datas,
  22. [],
  23. name='startup',
  24. debug=False,
  25. bootloader_ignore_signals=False,
  26. strip=False,
  27. upx=True,
  28. upx_exclude=[],
  29. runtime_tmpdir=None,
  30. console=False , icon='unipredictor-icon.ico')

字符串

展开查看全部
lnxxn5zx

lnxxn5zx2#

这个问题正是所显示的。你需要为模型扩展PYTHONPATH。在你的spec文件中也为模型添加包路径。

  1. # -*- mode: python ; coding: utf-8 -*-
  2. block_cipher = None
  3. a = Analysis(['startup.py'],
  4. pathex=['/home/kenneth/PycharmProjects/universal_predictor',
  5. '/home/kenneth/PycharmProjects/universal_predictor/models'],
  6. binaries=[],
  7. datas=[],
  8. hiddenimports=['models', 'stapp'],
  9. hookspath=['.'],
  10. runtime_hooks=[],
  11. excludes=['torch.distributions'],
  12. win_no_prefer_redirects=False,
  13. win_private_assemblies=False,
  14. cipher=block_cipher,
  15. noarchive=False)
  16. pyz = PYZ(a.pure, a.zipped_data,
  17. cipher=block_cipher)
  18. exe = EXE(pyz,
  19. a.scripts,
  20. a.binaries,
  21. a.zipfiles,
  22. a.datas,
  23. [],
  24. name='startup',
  25. debug=False,
  26. bootloader_ignore_signals=False,
  27. strip=False,
  28. upx=True,
  29. upx_exclude=[],
  30. runtime_tmpdir=None,
  31. console=False , icon='unipredictor-icon.ico')

字符串

展开查看全部
fdx2calv

fdx2calv3#

我曾经遇到过类似的情况,我的解决方案是从根级别删除init.py。
此外,作为一个有用的通知,我想看到我自己之前,我深入到故障排除,不要忘记检查,如果你已经有所有需要的软件包在venv。

相关问题