2024-04-19 22:13:40 发布
网友
假设你在一个名为日志记录.py. 如果您尝试导入标准日志模块,那么最终将导入您所在的文件。如何从这里导入标准日志模块?在
你可以使用imp以绝对路径加载模块。在
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电脑上我这样做了:
我们可以看到,我们有相同的组件集。在
请记住,这不是很枯燥,这意味着您需要根据您所在的底层系统更新日志模块的位置,您可以通过
>>> 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
imp.find_module
fp, pathname, description = imp.find_module('logging')
最后一点,我确信你有自己的理由命名你的模块logging.py我仍然推荐一些不会冲突的东西。在
您总是可以从sys.path中删除当前目录,但这非常老套,而且不可靠。在测试之后,我意识到如果文件正在运行(如__main__),这是可以工作的,但如果它是导入的,这是非常不可靠的)。在
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 =,将其放入作用域中。)
load_module
reload(logging)
import logging
logging
logging =
我不知道是否能保证将当前目录放入模块路径的“”实际上是sys.path中的第一个条目。因此,始终可以将“”或“.”插入到系统路径你自己。所以,如果你想多疑的话,你可以这样做:
或者你可以变得更加偏执,例如,用不同的方式比较abspath(path)和{}和{},以确保没有人偷偷地强迫你重新导入自己。这取决于你的目标是什么。在
abspath(path)
你可以使用
imp
以绝对路径加载模块。在在我的mac电脑上我这样做了:
^{pr2}$我们可以看到,我们有相同的组件集。在
请记住,这不是很枯燥,这意味着您需要根据您所在的底层系统更新日志模块的位置,您可以通过
或者在找不到您的自定义
logging.py
的目录中使用imp.find_module
fp, pathname, description = imp.find_module('logging')
。。。在最后一点,我确信你有自己的理由命名你的模块
logging.py
我仍然推荐一些不会冲突的东西。在您总是可以从
sys.path
中删除当前目录,但这非常老套,而且不可靠。在测试之后,我意识到如果文件正在运行(如__main__
),这是可以工作的,但如果它是导入的,这是非常不可靠的)。在我认为最好的办法是不要用std-lib包使用的名称命名文件。在
答案来自萨米·维拉提供了很多有用的选择。但如果你在寻找最简单、最直接的答案:
这里需要注意的几点:
load_module
调用更像是reload(logging)
,而不是import logging
,因为它不会在本地作用域中绑定名称logging
,而是替换名称为logging
下的任何现有模块。因此,如果在此之前已经完成了import logging
,那么这个名称现在指的是新模块,而不是旧模块;如果没有,则名称logging
就不在您的范围内。(这就是为什么上面有logging =
,将其放入作用域中。)我不知道是否能保证将当前目录放入模块路径的“”实际上是
^{pr2}$sys.path
中的第一个条目。因此,始终可以将“”或“.”插入到系统路径你自己。所以,如果你想多疑的话,你可以这样做:或者你可以变得更加偏执,例如,用不同的方式比较}和{},以确保没有人偷偷地强迫你重新导入自己。这取决于你的目标是什么。在
abspath(path)
和{相关问题 更多 >
编程相关推荐