【发布时间】:2011-05-16 02:16:15
【问题描述】:
我需要使用 python 模块(在某些库中可用)。该模块如下所示:
class A:
def f1():
...
print "Done"
...
我只需要 A 类的功能。但是,当我导入模块时,底部的代码(打印和其他)会被执行。有没有办法避免这种情况?本质上我需要导入模块的一部分:“from module1 import A”应该只导入A。有可能吗?
【问题讨论】:
我需要使用 python 模块(在某些库中可用)。该模块如下所示:
class A:
def f1():
...
print "Done"
...
我只需要 A 类的功能。但是,当我导入模块时,底部的代码(打印和其他)会被执行。有没有办法避免这种情况?本质上我需要导入模块的一部分:“from module1 import A”应该只导入A。有可能吗?
【问题讨论】:
是的,当然:
from module1 import A
是通用语法。例如:
from datetime import timedelta
应该保护底部的代码在导入时不运行,如下所示:
if __name__ == "__main__":
# Put code that should only run when the module
# is used as a stand-alone program, here.
# It will not run when the module is imported.
【讨论】:
module1.A 仅依赖于module1.B 依赖于werkzeug,则仍需要安装werkzeug。
from module1 import A as B
除了@unwind's answer之外,通常的做法是保护模块中的代码,只有在模块直接使用时才应该运行:
if __name__ == "__main__":
<code to only execute if module called directly>
这样就可以正常导入模块了。
【讨论】:
如果您只是对打印语句感到恼火,您可以将代码的输出重定向到不可见的地方,就像这篇文章的一条评论中解释的那样:http://coreygoldberg.blogspot.com/2009/05/python-redirect-or-turn-off-stdout-and.html
sys.stdout = open(os.devnull, 'w')
# now doing the stuff you need
...
# but do not forget to come back!
sys.stdout = sys.__stdout__
文档:http://docs.python.org/library/sys.html#sys.stdin
但是如果你想停用文件修改或耗时的代码,我唯一想到的就是一些肮脏的技巧:将你需要的对象复制到另一个文件中,然后导入它(但我不推荐它!)。
【讨论】: