我用“ pyinstaller --onefile myapp.py”打包了一个python应用程序,该应用程序创建了一个可执行文件,该应用程序运行良好。现在,我希望能够从系统中导入模块(如果存在),否则可以使用单个可执行文件中的捆绑模块。我特别想从系统中导入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文件,如下面的代码所示,其中使用简单的print语句创建了一个虚拟的“ 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不是单个文件,所以现在我需要了解如何从目录导入。任何建议表示赞赏!
编辑2 我在这里找到了解决方案:Python use importlib to import a module from a package directory
答案 0 :(得分:0)
经过更多研究和发布,我得到了以下解决方案(来自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__)