好的,所以我知道from-import
与import
“完全”相同,除了它显然不是因为命名空间的填充方式不同。
我的问题主要是因为我有一个utils
模块,它有一个或两个函数供我的应用程序中的每个其他模块使用,我正在努力合并标准库logging
模块,据我所知,我需要这样做:
import logging
logging.basicConfig(filename="/var/log") # I want file logging
baselogger = logging.getLogger("mine")
#do some customizations to baselogger
然后在另一个模块中使用它我会再次导入日志记录:
import logging
logger = logging.getlogger("mine")
# log stuff
但我想知道的是,如果我做from utils import awesome_func
我的记录器肯定会被设置,记录模块是否会按照我想要的方式设置?
这也适用于其他通用设置。
答案 0 :(得分:6)
你的问题的答案是肯定的。
有关导入过程的详细说明,请参阅Frederik Lundh的“Importing Python Modules”。
特别是,我会引用回答您查询的部分。
Python如何导入模块?
[...]
- 创建一个新的空模块对象(这本质上是一个字典)
- 将该模块对象插入sys.modules字典
- 加载模块代码对象(如有必要,首先编译模块)
- 在新模块的命名空间中执行模块代码对象。代码分配的所有变量都可以通过模块对象获得。
醇>
以及使用from-import
:
导入模块的方法有很多种
[...]
来自X import a,b,c 的导入模块X,并在当前命名空间中为给定对象创建引用。或者换句话说,您现在可以在程序中使用a和b和c。
注意我已经省略了一些事情。值得一读整篇文档,实际上很短。
答案 1 :(得分:5)
看起来答案是肯定的:
$ echo 'print "test"
def f1():
print "f1"
def f2():
print "f2"
' > util.py
$ echo 'from util import f1
f1()
from util import f2
f2()
' > test.py
$ python test.py
test
f1
f2
$
答案 2 :(得分:1)
是的,from MODULE import OBJECT
执行模块中的所有内容,然后有效地执行OBJECT = MODULE.OBJECT
。从某种意义上说,您可以判断模块已经加载,因为它现在位于sys.modules
字典中。
答案 3 :(得分:0)
如上所述,是的。 你可以写一个简单的测试来确定:
# file m.py
import sys
# define function
def f():
pass
#execute this when module is loaded (i.e. imported or run as script)
print 'imported', __name__
# print all "exposed" variables to make sure that the f is visible
print dir(sys.modules[__name__])
# file main.py
from m import f
print 'done'
我建议您每次怀疑某些导入或子类或其他内容是否有效时都会编写此类测试。