如何以编程方式执行:python中的“from lib import *”

时间:2016-02-29 18:23:07

标签: python import

我在寻找怎么做

from myLib import *

在我的python代码中,以便进行导入循环

__import__()方法似乎不提供*功能,因为我必须指定要导入的每个内容。

有办法做*吗?

非常感谢您的帮助

修改

澄清一下,目标是导入一堆类,它们位于包中的一堆模块中,通过类名直接访问它们,而不是像myPacakge.myModule.myClass(),也不是myModule.myClass( )但只是myClass()

想象你有:

myScript.py
myPackage
    \__init__.py
    \myModule_0.py
    \myModule_1.py
    \myModule_2.py
    \myModule_3.py
    \myModule_4.py

每个myModule包含一堆类,并且您正在编辑myScript.py,您希望能够访问每个myModule_X.py中的所有类,如:

myClass()
myOtherClass()
myOtherOtherClass()

等...不像myModule_X.myClass()和myPackage.myModyle_X.myClass()

3 个答案:

答案 0 :(得分:3)

__import__ 返回导入模块的命名空间。如果你想从它做import *,那么你可以迭代该命名空间并将所有模块的名称填充到模块的全局变量中,这就是from modulename import *所做的。您可能不应该,就像您不应使用import *一样(除此之外,因为您甚至不知道您要导入的模块)但你可以。

module = __import__("modulename")
if hasattr(module, "__all__"):        # module tells us which names are all names
    globals().update((name, getattr(module, name)) for name in module.__all__)
else:                                 # import all non-private names
    globals().update((name, getattr(module, name)) for name in dir(module) 
                      if not name.startswith("_"))

你也可以像这样编写它,这有点安全,因为它可以避免破坏任何已经定义的全局名称(可能没有你需要的名字):

module = __import__("modulename")
if hasattr(module, "__all__"):        # module tells us which names are all names
    globals().update((name, getattr(module, name)) for name in module.__all__
                      if name not in globals())
else:                                 # import all non-private names
    globals().update((name, getattr(module, name)) for name in dir(module) 
                      if not (name.startswith("_") or name in globals()))

答案 1 :(得分:0)

import myLib 

将导入所有内容,但我建议不要导入所有

使用它你用

作为所有导入的序言
myLib.my_module

如果您只想动态导入某些内容,则需要进行条件导入,例如:

if condition_met:
    import myLib.my_module

答案 2 :(得分:0)

import *会对静态代码检查和调试造成严重破坏,因此我不建议在脚本中使用它。假设您没有尝试做一些不明智的事情,您可以考虑使用__all__属性来获取包的成员字符串列表。

import my_package
for sub_package in my_package.__all__:
    print "found " + sub_package