我有一个消息文件夹(包) __init__.py
文件和另一个模块messages_en.py
里面。 在__init__.py
如果我导入messages_en
它的工作原理,但__import__
失败,“导入错误:没有模块名为messages_en”
import messages_en # it works
messages = __import__('messages_en') # it doesn't ?
我曾经认为“进口X”是说的只是另一种方式__import__('x')
添加全局的说法对我来说就足够了:
__import__('messages_en', globals=globals())
事实上,只有__name__
这里需要:
__import__('messages_en', globals={"__name__": __name__})
如果这是一个路径问题,您应该使用level
参数(从文档 ):
__import__(name, globals={}, locals={}, fromlist=[], level=-1) -> module
Level is used to determine whether to perform
absolute or relative imports. -1 is the original strategy of attempting
both absolute and relative imports, 0 is absolute, a positive number
is the number of parent directories to search relative to the current module.
__import__
是通过import语句称为内部函数。 在日常的编码,你并不需要(或希望)来调用__import__
从Python文档:
例如,语句import spam
导致字节码类似下面的代码:
spam = __import__('spam', globals(), locals(), [], -1)
在另一方面,声明from spam.ham import eggs, sausage as saus
的结果
_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], -1)
eggs = _temp.eggs
saus = _temp.sausage
更多信息: http://docs.python.org/library/functions.html
一定要modules目录附加到你的Python路径。
你的路径(Python的经过搜索模块和文件目录的列表)存储在sys模块的路径属性。 由于路径是一个列表,你可以使用Append方法将新的目录添加到路径。
例如,在目录/ home / ME / mypy添加到路径:
import sys
sys.path.append("/home/me/mypy")
你可以试试这个:
messages == __import__('Foo.messages_en', fromlist=['messages_en'])
您需要手动导入您的动态包路径的顶部包。
例如,在我写的文件的开头:
import sites
后来在此代码对我的作品:
target = 'some.dynamic.path'
my_module = __import__ ('sites.%s.fabfile' % target, fromlist=["sites.%s" % target])
据我所知,这个问题是关于__import__()
函数,但我认为, importlib
包是最适合运行包进口,如果你正在使用Python 2.7以上版本作为买卖本文档 :
注:模块的编程进口应该使用import_module()而不是此函数。
可能的疑难杂症: 这是在Python 2.7版介绍:
新的2.7版。
该模块是什么在功能更全面的包在Python 3.1,提供进口的完整实现的同名可用一个小的子集。 什么是这里已经提供了有助于缓解过渡,从2.7至3.1。
在你的情况,你可以使用:
import importlib
messages = importlib.import_module('messages_en')
另外,如果你想指定包的名称,然后from messages import messages_en
可以写为:
importlib.import_module('.messages_en', 'messages')
请注意.
在.messages_en
用于相对路径解析描述在这里 :
... name参数指定哪些模块在绝对或相对术语(例如无论是pkg.mod或..mod)导入。 如果在相对的术语是指定的名称,则该包参数必须设置为,其是充当锚解决包的名称(在包的名称例如import_module(“.. MOD”,‘pkg.subpkg’)将导入pkg.mod)。
文章来源: How can I import a package using __import__() when the package name is only known at runtime?