gpt4 book ai didi

python - pyinstaller onefile 但仍然导入外部库(如果可用)

转载 作者:行者123 更新时间:2023-12-05 05:10:30 26 4
gpt4 key购买 nike

我用“pyinstaller --onefile myapp.py”打包了一个 python 应用程序,它创建了一个可执行文件,并且该应用程序运行良好。现在我希望能够从系统中导入一个模块(如果存在),否则使用单个可执行文件中的捆绑模块。如果安装了 PySide2,我特别想从系统导入 PySide2,理想情况下,它带有一个可配置标志,指​​示应用程序是从系统加载还是从单个可执行文件加载。我已经在使用由单个可执行文件读取的配置文件,因此我可以在其中放置一个标志来指示如何加载模块。有办法实现吗?

伪代码是这样的:

read import_external from configuration file
if import_external is true:
try:
import PySide2 from system
except:
import PySide2 from executable

编辑 我正在接近解决方案。我可以从 pyinstaller onefile 可执行文件动态导入单个 Python 文件,如以下代码所示,我在其中创建了一个虚拟“PySide2.py”文件,其中包含一个简单的打印语句来验证它是否已导入。

import os
print("Import test")
if os.path.isfile('./PySide2.py'):
print('Importing local PySide2')
import importlib
import importlib.util
spec = importlib.util.spec_from_file_location('PySide2', './PySide2.py')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
else:
print('Importing system PySide2')
import PySide2
print(PySide2.__version__)
print("Import complete")

但是 PySide2 不是单个文件,所以现在我需要了解如何从目录导入。任何建议表示赞赏!

EDIT 2 我在这里找到了解决方案:Python use importlib to import a module from a package directory

最佳答案

经过更多研究和发布,我得到了以下解决方案(来自 this post)。

import os, sys
if os.path.isdir('./PySide2/'):
print('Importing local PySide2')
import importlib.util

MODULE_PATH = "./PySide2/__init__.py"
MODULE_NAME = "PySide2"

spec = importlib.util.spec_from_file_location(MODULE_NAME, MODULE_PATH)
PySide2 = importlib.util.module_from_spec(spec)
sys.modules[spec.name] = PySide2
spec.loader.exec_module(PySide2)

print(PySide2.__version__)
else:
print('Importing system PySide2')
import PySide2
print(PySide2.__version__)

关于python - pyinstaller onefile 但仍然导入外部库(如果可用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56572914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com