我尝试使用pyinstaller生成一个.exe文件。
它工作得很好,除了一个包不是由pyinstaller自动检测和导入的。
这样的包,在本例中我们将调用"packageOfInterest",没有导入,因为开发人员没有提供钩子。
阅读一些文档后,我了解到这个问题可以很容易地通过在.spec中添加以下行来解决
hiddenimports=["packageOfInterest"]
不幸的是,它不能工作,即使使用这样的代码行,"packageOfInterest“也没有导入。
,所以我的问题是:.spec文件中还缺少什么?
在我的.spec文件下面,我已经成功地在许多应用程序中使用了,在这些应用程序中,pyinstaller可以自动检测到包,因此不是。
import sys
import os
from kivy_deps import sdl2, glew
from kivymd import hooks_path as kivymd_hooks_path
path = os.path.abspath(".")
a = Analysis(
["MyScript.py"],
# "packageOfInterest" in the "hiddenimports" is the package name
# that pyinstaller could not import automatically
hiddenimports=["kivymd.stiffscroll", "packageOfInterest"],
pathex=[path],
hookspath=[kivymd_hooks_path],
datas = [("media\\", "media\\")],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=None,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=None)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
debug=False,
strip=False,
upx=True,
name="MyScript",
console=True,
icon='myicon.ico'
)
"packageOfInterest“的位置在路径上:
C:\Users\ASUS\AppData\Local\Programs\Python\Python39\Lib\site-packages
也许应该在的某个地方指定这个路径(例如,应该在" path“值之后的"pathex”中添加d)。
一般来说,很适合识别一个清晰的方法,检查通过"MyScript.py“导入的所有包,这些包不能由、自动导入,并且强制它们导入。
同时,希望了解如何定制为.spec,以解决问题。
提前感谢
发布于 2021-08-07 03:01:13
The .exe crashed because one file is not showing. Such file was belonging to the "packageofinterest" (mne)
嗯..。您可以尝试使用--collect-data packageofinterest
,因为您似乎丢失了一些属于包的文件。
此外,如果不想使用规范文件,也可以使用--hidden-import packageofinterest
。
发布于 2022-11-29 13:42:35
这个问题似乎很老,但我希望它能对将来的人有所帮助。我最近尝试创建一个GUI捆绑应用程序。当我遇到类似的兴趣时,当我遇到类似的兴趣,强迫PyInstaller去拾取任何我试图捆绑到可执行文件中的项目所使用的模块时,这就避免了很多导入模块相关的问题。这是我的解决办法。
每个Python模块都有文件和/或path属性/ies。这是因为我们安装的每一个第三方实现(通过pip、easy_install等)都是作为一个模块(通过文件的路径)或一个包(通过path)提供的。只有那些可用的包才能访问文件和path属性。
因此,让我们假设PyInstaller无法获取的模块是zipfile和psutil。前者是一个模块,后者是一个包。
import zipfile # Use any of the import rules.
print( zipfile.__file__ ) # Take a look at where its absolute path resides.
import psutil
print( psutil.__path__ )
print( psutil.__file__ ) # This will return the package's __init__.py file. Definitely not what you want.
现在,使用-- add 选项将这个路径添加到PyInstaller的命令中。语法
pyinstaller --add-data module_absolute_path;destination my_program_startup_file.py
注意:-The空间围绕打印语句只是为了可读性。-The 总是“.”有关软件包Ex:psutil/的模块和模块名称,请参阅PyInstaller文档以获得清晰性
示例
pyinstaller --onefile --clean --add-data C:\Users\USER\AppData\Local\Programs\Python\Python310\Lib\site-packages\psutil;psutil\ my_program_startup_file.py
https://stackoverflow.com/questions/68684228
复制相似问题