python import引用self_Python:使用import时执行相对导入?

以下是此测试中的文件:main.py

app/

|- __init__.py

|- master.py

|- plugin/

|- |- __init__.py

|- |- p1.py

|- |_ p2.py

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

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

文件内容如下:

主.py:import app

app.test()

app.test2()

应用程序初始化: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

应用程序/插件/初始化:

app/plugin/p1.py版本:from .. import master

def test():

print "test in p1 is running"

print "from p1: myVar = %d" % master.myVar

app/plugin/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

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

from .. import master

ValueError: Attempted relative import in non-package

执行一直通过test()函数进行,当test2()尝试执行其__import__语句时出错,而p2则尝试执行相对导入(当p1通过import语句显式导入时,会执行操作,recall)

很明显,使用__import__与使用import语句做了一些不同的事情。Python文档指出,使用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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值