导入与当前文件同名的文件

2024-04-19 22:13:40 发布

您现在位置:Python中文网/ 问答频道 /正文

假设你在一个名为日志记录.py. 如果您尝试导入标准日志模块,那么最终将导入您所在的文件。如何从这里导入标准日志模块?在


Tags: 模块文件py标准记录
3条回答

你可以使用imp以绝对路径加载模块。在

import imp
help(imp.load_module)
load_module(...)
    load_module(name, file, filename, (suffix, mode, type)) -> module
    Load a module, given information returned by find_module().
    The module name must include the full package name, if any.

在我的mac电脑上我这样做了:

^{pr2}$

我们可以看到,我们有相同的组件集。在

请记住,这不是很枯燥,这意味着您需要根据您所在的底层系统更新日志模块的位置,您可以通过

>>> import logging
>>> logging.__file__
'/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/logging/__init__.pyc'

或者在找不到您的自定义logging.py的目录中使用imp.find_modulefp, pathname, description = imp.find_module('logging')。。。在

最后一点,我确信你有自己的理由命名你的模块logging.py我仍然推荐一些不会冲突的东西。在

您总是可以从sys.path中删除当前目录,但这非常老套,而且不可靠。在测试之后,我意识到如果文件正在运行(如__main__),这是可以工作的,但如果它是导入的,这是非常不可靠的)。在

我认为最好的办法是不要用std-lib包使用的名称命名文件。在

答案来自萨米·维拉提供了很多有用的选择。但如果你在寻找最简单、最直接的答案:

import imp
import sys

f, pathname, desc = imp.find_module('logging', sys.path[1:])
logging = imp.load_module('logging', f, pathname, desc)

这里需要注意的几点:

load_module调用更像是reload(logging),而不是import logging,因为它不会在本地作用域中绑定名称logging,而是替换名称为logging下的任何现有模块。因此,如果在此之前已经完成了import logging,那么这个名称现在指的是新模块,而不是旧模块;如果没有,则名称logging就不在您的范围内。(这就是为什么上面有logging =,将其放入作用域中。)

我不知道是否能保证将当前目录放入模块路径的“”实际上是sys.path中的第一个条目。因此,始终可以将“”或“.”插入到系统路径你自己。所以,如果你想多疑的话,你可以这样做:

^{pr2}$

或者你可以变得更加偏执,例如,用不同的方式比较abspath(path)和{}和{},以确保没有人偷偷地强迫你重新导入自己。这取决于你的目标是什么。在

相关问题 更多 >