Python使用importlib从包目录导入模块

Python使用importlib从包目录导入模块,python,dynamic,import,module,python-importlib,Python,Dynamic,Import,Module,Python Importlib,我正在尝试使用importlib动态导入PySide2,因为静态地使用import对于我的应用程序来说是不够的。我需要importlib,因为最终它将与pyinstaller一起使用,以创建一个可以动态导入PySide2的可执行文件,而不仅仅是从单个可执行文件导入 我已经复制了使用pip下载的整个PySide2包目录。这个PySide2版本比我默认使用的版本旧,当“PySide2”目录出现在我的源目录中时,我想改用它 根据中的答案,我有以下代码来执行导入: import os, sys prin

我正在尝试使用
importlib
动态导入PySide2,因为静态地使用
import
对于我的应用程序来说是不够的。我需要importlib,因为最终它将与pyinstaller一起使用,以创建一个可以动态导入PySide2的可执行文件,而不仅仅是从单个可执行文件导入

我已经复制了使用pip下载的整个PySide2包目录。这个PySide2版本比我默认使用的版本旧,当“PySide2”目录出现在我的源目录中时,我想改用它

根据中的答案,我有以下代码来执行导入:

import os, sys
print("Import test")
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)
    print("spec.name is " + str(spec.name))
    module = importlib.util.module_from_spec(spec)
    sys.modules[spec.name] = module 
    print(sys.modules)
    spec.loader.exec_module(module)

    print(PySide2.__version__)
else:
    print('Importing system PySide2')
    import PySide2
    print(PySide2.__version__)
但是当我运行它时,我得到了
namererror:name'PySide2'没有定义
,即使我在sys.modules中看到PySide2存在(在下面的输出中一直向右滚动以查看它的存在):

$python importTest.py
导入测试
导入本地PySide2
规格名称为PySide2
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,“os:,“stat:,”posixpath:,“genericpath:,“os.path:,”集合abc:,”站点内置“:,”站点自定义“,”导入库“:,”导入库“,”导入库“,”导入库“,”导入库“,”外部“,”类型“,”警告“,”导入库.util“,”导入库.abc“,”导入库“,”导入库“,”操作员“,”_运算符“:,”关键字“:,”heapq“:,”heapq“:,”itertools“:,”reprlib“:,”集合“:,”函数工具“:,”函数工具“:,”PySide2“:}
回溯(最近一次呼叫最后一次):
文件“importTest.py”,第17行,在
打印(PySide2.版本)
NameError:未定义名称“PySide2”
我不明白为什么它在sys.modules中出现时会说“name'PySide2'未定义”。

从中,当找不到本地或全局名称时,会引发
名称错误

对于标准进口声明, 它将做以下事情:

  • 查找并加载模块
  • 更新sys.modules
  • 使用指向
    导入foo
    的实际模块对象的变量名更新全局dict,当它从某个对象导入时更新多个变量(同时检查模块的
    \uuuuuuuuuu
在这里,您已经手动完成了前两个步骤,只需添加:

PySide2 = module
PySide2 = module