当父目录在 sys.path 中时,Python 无法始终如一地找到模块

克里斯

我目前正在做一个项目,我需要导入可能位于文件系统任何位置的自制模块。但是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.pathsys.path_hooks查找模块,并且sys.meta_path具有在这种情况下不会自动“刷新”的内部缓存。

因此,要成功导入在解释器开始执行后创建的模块,其内部缓存sys.meta_path应该无效。

这可以通过importlib.invalidate_caches()在创建测试模块后调用来实现

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

页面重定向在PHP或JavaScript中无法始终如一地工作

我无法在 R 中始终如一地导入库存数据

第三方脚本在反应组件中无法始终如一地找到具有特定 id 的按钮

让鼠标事件在 d3.js 中始终如一地工作

父目录在根目录中列出

为什么R在几年间不能始终如一地处理夏令时?

在Clojure中,为什么“某些”功能不能在集合上始终如一地工作?

加载模块时使用sys.path.insert(0,path)和sys.path(append)的效果

导入没有sys.path.append的父目录包

Python不会导入其路径在sys.path中的模块

在Python中,有没有一种方法可以始终如一地对由列表和元组组成的列表进行排序?

Python3无法在sys.path中加载模块

Python sys.path追加错误目录

Vega无法始终如一地渲染规格

jQuery - .off() 无法始终如一地工作

angularjs $setPrestine 无法始终如一地工作

使用._pth时,脚本目录未包含在sys.path中

将阴影模块导入sys.path中的阴影模块

Python sys.path.append

使用sys.path.append导入python模块

Python如何从sys.path不在的路径中加载模块

Pycharm 无法识别 sys.path 中的更改

防止将脚本目录添加到Python 3中的sys.path

在Google App Engine中创建一个lib目录并将其添加到sys.path

sys.path 找不到本地目录

带有sys.path和os.path问题的Python模块导入

目录-Linux中的/ sys

ModuleNotFoundError:即使在入侵sys.path()之后,也没有在python 3中命名模块

python中sys.path.insert的第一个参数