首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pyinstaller和hiddenimport:如何强制导入无法由pyinstaller自动导入的包

Pyinstaller和hiddenimport:如何强制导入无法由pyinstaller自动导入的包
EN

Stack Overflow用户
提问于 2021-08-06 15:36:13
回答 2查看 1.7K关注 0票数 2

我尝试使用pyinstaller生成一个.exe文件。

它工作得很好,除了一个包不是由pyinstaller自动检测和导入的。

这样的包,在本例中我们将调用"packageOfInterest",没有导入,因为开发人员没有提供钩子

阅读一些文档后,我了解到这个问题可以很容易地通过在.spec中添加以下行来解决

代码语言:javascript
运行
复制
hiddenimports=["packageOfInterest"]

不幸的是,它不能工作,即使使用这样的代码行,"packageOfInterest“也没有导入

,所以我的问题是:.spec文件中还缺少什么?

在我的.spec文件下面,我已经成功地在许多应用程序中使用了,在这些应用程序中,pyinstaller可以自动检测到包,因此不是

代码语言:javascript
运行
复制
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“的位置在路径上:

代码语言:javascript
运行
复制
C:\Users\ASUS\AppData\Local\Programs\Python\Python39\Lib\site-packages 

也许应该在的某个地方指定这个路径(例如,应该在" path“值之后的"pathex”中添加d)。

一般来说,很适合识别一个清晰的方法,检查通过"MyScript.py“导入的所有包,这些包不能由自动导入,并且强制它们导入

同时,希望了解如何定制为.spec,以解决问题。

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2021-08-07 03:01:13

代码语言:javascript
运行
复制
The .exe crashed because one file is not showing. Such file was belonging to the "packageofinterest" (mne)

嗯..。您可以尝试使用--collect-data packageofinterest,因为您似乎丢失了一些属于包的文件。

此外,如果不想使用规范文件,也可以使用--hidden-import packageofinterest

票数 0
EN

Stack Overflow用户

发布于 2022-11-29 13:42:35

这个问题似乎很老,但我希望它能对将来的人有所帮助。我最近尝试创建一个GUI捆绑应用程序。当我遇到类似的兴趣时,当我遇到类似的兴趣,强迫PyInstaller去拾取任何我试图捆绑到可执行文件中的项目所使用的模块时,这就避免了很多导入模块相关的问题。这是我的解决办法。

每个Python模块都有文件和/或path属性/ies。这是因为我们安装的每一个第三方实现(通过pip、easy_install等)都是作为一个模块(通过文件的路径)或一个包(通过path)提供的。只有那些可用的包才能访问文件path属性。

因此,让我们假设PyInstaller无法获取的模块是zipfilepsutil。前者是一个模块,后者是一个包。

代码语言:javascript
运行
复制
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的命令中。语法

代码语言:javascript
运行
复制
pyinstaller --add-data module_absolute_path;destination my_program_startup_file.py

注意:-The空间围绕打印语句只是为了可读性。-The 总是“.”有关软件包Ex:psutil/的模块和模块名称,请参阅PyInstaller文档以获得清晰性

示例

代码语言:javascript
运行
复制
pyinstaller --onefile --clean --add-data C:\Users\USER\AppData\Local\Programs\Python\Python310\Lib\site-packages\psutil;psutil\ my_program_startup_file.py
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68684228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档