我目前正在做一个项目,我需要导入可能位于文件系统任何位置的自制模块。但是python似乎无法始终如一地导入它们。
所有模块都具有相同的名称,这就是为什么我将它们与它们的父目录结合起来,就像这样:xyz.abc
对于abc.py
在名为xyz
. xyz 的父目录被添加到路径中。为了稍后导入它们,我使用importlib.import_module(module_name)
where module name is xyz.abc
。
为了测试我的代码,我使用 python 的临时文件库来创建临时目录和临时文件。(/tmp
我的系统在重新启动时被清理,而不是自动清理。)
我试过添加一个__init__.py
文件,它没有改变任何东西。我还试图os.sync()
将文件强制写入我的磁盘,认为这可能是一个竞争问题,但它没有帮助。
这是它中断的代码:
if parent not in sys.path:
sys.path.insert(0, parent)
module_name = os.path.basename(dir_path) + "." + filename.split(".")[0]
return importlib.import_module(module_name)
目录的树结构为:
/tmp/tmp9tp_1j_q/
└── tmprvbxhk3t.py
并且sys.path
具有'/tmp'
在它时,我的权利之前打印出来module_name = ...
。
执行代码时,有时有效,有时无效。我得到:ModuleNotFoundError: No module named 'tmpfjig62pf'
我想可能sys.path
不是在插入后直接在内部更新。
我需要一些帮助来解决这个问题。
问题不在sys.path
,但很接近。它是 Finder 对象,sys.meta_path
它使用sys.path
和sys.path_hooks
查找模块,并且sys.meta_path
具有在这种情况下不会自动“刷新”的内部缓存。
因此,要成功导入在解释器开始执行后创建的模块,其内部缓存sys.meta_path
应该无效。
这可以通过importlib.invalidate_caches()
在创建测试模块后调用来实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句