如何导入使用__import __()时,包名在运行时只知道一个包?(How can I impor

2019-06-24 09:25发布

我有一个消息文件夹(包) __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')

Answer 1:

添加全局的说法对我来说就足够了:

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

事实上,只有__name__这里需要:

__import__('messages_en', globals={"__name__": __name__})


Answer 2:

如果这是一个路径问题,您应该使用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.


Answer 3:

__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



Answer 4:

一定要modules目录附加到你的Python路径。

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

例如,在目录/ home / ME / mypy添加到路径:

import sys
sys.path.append("/home/me/mypy") 


Answer 5:

你可以试试这个:

messages == __import__('Foo.messages_en', fromlist=['messages_en'])


Answer 6:

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

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

import sites

后来在此代码对我的作品:

target = 'some.dynamic.path'
my_module = __import__ ('sites.%s.fabfile' % target, fromlist=["sites.%s" % target])


Answer 7:

据我所知,这个问题是关于__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?