gpt4 book ai didi

Python:使用 __import__ 时执行相对导入?

转载 作者:太空狗 更新时间:2023-10-29 21:50:18 25 4
gpt4 key购买 nike

这里是这个测试中的文件:

main.py
app/
|- __init__.py
|- master.py
|- plugin/
|- |- __init__.py
|- |- p1.py
|- |_ p2.py

我们的想法是拥有一个支持插件的应用程序。可以将新的 .py 或 .pyc 文件放入符合我的 API 的插件中。

我在应用程序级别有一个 master.py 文件,其中包含所有插件可能需要访问的全局变量和函数,以及应用程序本身。出于此测试的目的,“app”包含 app/__init__.py 中的测试函数。在实践中,应用程序可能会被移动到单独的代码文件中,但我只是在该代码文件中使用 import master 来引入对 master 的引用.

文件内容如下:

主要.py:

import app

app.test()
app.test2()

应用程序/__init__.py:

import sys, os

from plugin import p1

def test():
print "__init__ in app is executing test"
p1.test()

def test2():
print "__init__ in app is executing test2"
scriptDir = os.path.join ( os.path.dirname(os.path.abspath(__file__)), "plugin" )
print "The scriptdir is %s" % scriptDir
sys.path.insert(0,scriptDir)
m = __import__("p2", globals(), locals(), [], -1)
m.test()

应用程序/master.py:

myVar = 0

应用程序/插件/__init__.py:

<empty file>

应用程序/插件/p1.py:

from .. import master

def test():
print "test in p1 is running"
print "from p1: myVar = %d" % master.myVar

应用程序/插件/p2.py:

from .. import master

def test():
master.myVar = 2
print "test in p2 is running"
print "from p2, myVar: %d" % master.myVar

由于我显式导入了 p1 模块,所以一切都按预期进行。但是,当我使用 __import__ 导入 p2 时,出现以下错误:

__init__ in app is executing test
test in p1 is running
from p1: myVar = 0
__init__ in app is executing test2
The scriptdir is ....../python/test1/app/plugin
Traceback (most recent call last):
File "main.py", line 4, in <module>
app.test2()
File "....../python/test1/app/__init__.py", line 17, in test2
m = __import__("p2", globals(), locals(), [], -1)
File "....../python/test1/app/plugin/p2.py", line 1, in <module>
from .. import master
ValueError: Attempted relative import in non-package

执行一直通过 test() 函数进行,并在 test2() 尝试执行其 __import__ 语句时出错,这反过来 p2 尝试进行相对导入(确实当p1是通过导入语句显式导入时起作用,回想一下)

很明显,使用 __import__ 与使用 import 语句不同。 Python 文档指出,使用 import 只是在内部转换为 __import__ 语句,但实际情况比表面上看到的要多。

由于该应用程序是基于插件的,因此在主应用程序中编写显式导入语句当然是不可行的。在

中使用 import 本身

我在这里错过了什么?使用 __import__ 手动导入模块时,如何让 Python 的行为符合预期?看来我可能没有完全理解相对导入的概念,或者我只是遗漏了一些关于导入发生位置的信息(即在函数内部而不是在代码文件的根目录)

编辑:我发现了以下可能但不成功的解决方案:

m = __import__("p2",globals(),locals(),"plugin")

(返回与上面完全相同的错误)

m = __import__("plugin",fromlist="p2")

(返回对 app.plugin 的引用,而不是对 app.plugin.p2 的引用)

m = __import__("plugin.p2",globals(),locals())

(返回对 app.plugin 的引用,而不是对 app.plugin.p2 的引用)

import importlib
m = importlib.import_module("plugin.p2")

(返回:)

Traceback (most recent call last):
File "main.py", line 4, in <module>
app.test2()
File "....../python/test1/app/__init__.py", line 20, in test2
m = importlib.import_module("plugin.p2")
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named plugin.p2

最佳答案

我遇到过类似的问题。
__import__ 仅在所有父 __init__.py 文件为空时导入子模块。您应该改用 importlib

import importlib

p2 = importlib.import_module('plugin.p2')

关于Python:使用 __import__ 时执行相对导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17344561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com