16

我有一个消息文件夹(包),里面有__init__.py文件和另一个模块。messages_en.py如果__init__.py我导入messages_en它可以工作,但__import__失败并出现“ImportError:没有名为messages_en的模块”

import messages_en # it works
messages = __import__('messages_en') # it doesn't ?

我曾经认为'import x'只是另一种说法__import__('x')

4

7 回答 7

21

如果是路径问题,您应该使用level参数(来自docs):

__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.
于 2009-06-29T11:49:01.627 回答
20

添加 globals 参数对我来说就足够了:

__import__('messages_en', globals=globals())

其实__name__这里只需要:

__import__('messages_en', globals={"__name__": __name__})
于 2012-11-01T10:22:54.710 回答
14

__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

于 2009-06-29T11:46:41.710 回答
4

请务必将模块目录附加到您的 python 路径。

您的路径(Python 搜索模块和文件所经过的目录列表)存储在 sys 模块的路径属性中。由于路径是一个列表,您可以使用 append 方法将新目录添加到路径中。

例如,要将目录 /home/me/mypy 添加到路径中:

import sys
sys.path.append("/home/me/mypy") 
于 2010-05-09T20:07:42.990 回答
3

我知道这个问题是关于__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')

请注意用于相对路径分辨率的.in 如下所述:.messages_en

... name 参数以绝对或相对术语(例如 pkg.mod 或 ..mod)指定要导入的模块。如果名称以相对术语指定,则 package 参数必须设置为作为解析包名称的锚点的包名称(例如 import_module('..mod', 'pkg.subpkg')将导入 pkg.mod)。

于 2019-03-15T11:32:24.973 回答
2

你可以试试这个:

messages == __import__('Foo.messages_en', fromlist=['messages_en'])
于 2009-06-29T11:53:31.727 回答
0

您需要手动导入动态包路径的顶级包。

例如在我写的文件的开头:

import sites

然后稍后在代码中这对我有用:

target = 'some.dynamic.path'
my_module = __import__ ('sites.%s.fabfile' % target, fromlist=["sites.%s" % target])
于 2015-06-09T15:12:53.353 回答