如何导入名称中包含点的包中的所有模块?

时间:2014-12-18 20:05:27

标签: python

This linked answer告诉我如何导入名称中带有点的单个模块,但如何从带有点的导入所有模块在它的名字:

from package.with.dot.in.name import *

我的文件看起来像:

package.with.dot.in.name/
    __init__.py
    module_1.py
    module_2.py

我知道在包名中加点是错误的。因为Sikuli要求你的“项目”命名为“{project} .sikuli”。

3 个答案:

答案 0 :(得分:2)

基于this answer和一些评论,我能够做到:

name = 'package.with.dot.in.name'
pathname, description = imp.find_module(name)[1:]
package = imp.load_module(name, None, pathname, description)
locals().update(package.__dict__)

答案 1 :(得分:1)

虽然我绝不会鼓励这种行为,但您可以通过使用您导入的模块的内部属性字典来引用locals()来更新>>> r = __import__('requests') >>> l = locals() >>> l.update(r.__dict__) >>> locals()['cookies'] <module 'requests.cookies' from '/usr/local/lib/python2.7/site-packages/requests/cookies.pyc'>

>>> cookies
<module 'requests.cookies' from '/usr/local/lib/python2.7/site-packages/requests/cookies.pyc'>

或者,换句话说:

name = 'package.with.dot.in.name'
pathname, description = imp.find_module(name)[1:]
package = imp.load_module(name, None, pathname, description)
locals().update(package.__dict__)

编辑:使用下面的Jace自我回答,以下内容适用于带点的文件名:

{{1}}

答案 2 :(得分:0)

嗯,就像Python中的几乎所有东西一样,导入系统是可以破解的。您只需创建一个自定义加载器并在sys.meta_path注册(有关详细信息,请参阅PEP 302)。

让我们说你想破解导入系统以加载&#34; foo.bar&#34;如果您导入&#34; foo_dot_bar&#34;:

# search folder "foo.bar" and load it as a package
from foo_dot_bar import *     

警告:这只是一个起点,它不是一个经过全面测试的解决方案;事实上,这超出了我的巫术水平!

# stupid_dot_importer.py
import os
import imp
import sys

class StupidDotPackageLoader(object):
    @staticmethod
    def _get_real_name(name):
        return ".".join(name.split('_dot_'))
    def find_module(self, name, path=None):
        try:
            imp.find_module(self._get_real_name(name))
        except ImportError:
            return None
        return self
    def load_module(self, name):
        _, pathname, description = imp.find_module(self._get_real_name(name))
        return imp.load_module(self._get_real_name(name), None, pathname, description)

假设您具有以下结构:

foo.bar
   |
   +--- __init__.py 
   |
   +--- module1.py
   |
   +--- module2.py

$ cat foo.bar/__init__.py
from module1 import *
from module2 import *

$ cat foo.bar/module1.py
foo = 'bar'

$ cat foo.bar/module2.py
spam = 'eggs'

然后魔术:

>>> from stupid_dot_importer import *
>>> sys.meta_path = [StupidDotPackageLoader()]
>>> from foo_dot_bar import *
>>> foo
'bar'
>>> spam
'eggs'
>>>