pyinstaller onefile,但仍导入外部库(如果有)

时间:2019-06-13 03:17:41

标签: python import module pyinstaller

我用“ 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

1 个答案:

答案 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__)