![](/img/trans.png)
[英]how to fix Import Error: No module named... in python with VScode
[英]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'
当我同时添加src和src.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.