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”。
答案 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'
>>>