当包名称仅在运行时已知时,如何使用 __import__() 导入包?
我有一个消息文件夹(包),其中包含 __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 ?
我曾经认为“导入” x' 只是 __import__('x')
的另一种表达方式
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
如果是路径问题,则应使用
level
参数(来自 文档):If it is a path problem, you should use the
level
argument (from docs):添加全局参数对我来说就足够了:
事实上,这里只需要
__name__
:Adding the globals argument is sufficient for me:
In fact, only
__name__
is needed here:__import__
是一个由 import 语句调用的内部函数。 在日常编码中,您不需要(或不想)从 python 文档中调用
__import__
:例如,语句
import spam
会生成类似于以下代码的字节码:另一方面,语句
from spam.ham import Eggs, sausage as saus
会产生更多信息:
http://docs.python.org/library/functions.html
__import__
is an internal function called by import statement. In everyday coding you don't need (or want) to call__import__
from python documentation:
For example, the statement
import spam
results in bytecode resembling the following code:On the other hand, the statement
from spam.ham import eggs, sausage as saus
results inmore info:
http://docs.python.org/library/functions.html
请务必将模块目录附加到您的 python 路径。
您的路径(Python 搜索模块和文件时所经过的目录列表)存储在 sys 模块的 path 属性中。 由于路径是一个列表,因此您可以使用追加方法将新目录添加到路径中。
例如,要将目录 /home/me/mypy 添加到路径中:
Be sure to append the modules directory to your python path.
Your path (the list of directories Python goes through to search for modules and files) is stored in the path attribute of the sys module. Since the path is a list you can use the append method to add new directories to the path.
For instance, to add the directory /home/me/mypy to the path:
我知道这个问题是关于 __import__() 函数,但我认为如果您使用 Python 2.7 或更高版本,则
importlib
包最适合运行时包导入doc 中建议:可能的问题: 这是在 python 2.7 中引入的:
在您的情况下,您可以使用:
另外,如果您想指定包名称,则
from messages import messages_en
可以写为:importlib.import_module('.messages_en', 'messages ')
请注意
.messages_en
中的.
用于相对路径解析,如 此处:I understand that this question is about the
__import__()
function but I think theimportlib
package is best suited for run-time package imports if you are using Python 2.7 or above as advised in the doc:Possible Gotcha: This was introduced in python 2.7:
In your case, you may use:
Also, if you wanted to specify the package name, then
from messages import messages_en
may be written as:importlib.import_module('.messages_en', 'messages')
Note the
.
in.messages_en
used for relative path resolution as described here:你可以试试这个:
You could try this:
您需要手动导入动态包路径的顶层包。
例如,在文件的开头我写:
然后在代码中这对我有用:
You need to manually import the top package of your dynamic package path.
For example in the beginning of the file i write:
then later in code this works for me: