我正在尝试使Python 3兼容的代码。据我所知,在Python 3中,从同一个包导入模块必须是相对的。所以如果这是目录结构:
/package
/modA
/modB
有很多现有的代码看起来像这样(在modA中):
import modB
modB.some_function()
有没有办法改变导入,所以我可以继续以相同的方式调用方法/属性?
我知道你可以这样做:
from .modB import some_function
some_function()
但是我想尽可能避免改变所有的电话。当我这样称呼时:
import .modB
它给出了一个错误
从同一个包中相对导入模块modB
的语法是
from . import modB
这扩展了@ user2357112的答案
为了在python2和python3中工作,你必须:
结构体:
/package
__init__.py
modA.py
modB.py
__init__.py
的内容
from . import modA, modB
modA.py
的内容
# from . import modB ## works in py3 but not in py2
def testA():
""" call a function from modB """
from . import modB
modB.printB()
def printA():
print('I am in modA')
modB.py
的内容
# from . import modA ## works in py3 not in py2
def testB():
""" call a function from modA """
from . import modA
modA.printA()
def printB():
print('I am in modB')
然后你可以这样做:
import package
package.modA.testA()
package.modB.testB()
你可以使用importlib
import importlib
然后
modB = importlib.import_module('package.modB')
...如果你的相对路径导入存在持久性问题,那么它是不是最优的但仍然是一个可行的选择(永远不会遇到POSIX和OSx上的问题,但我在NT平台上遇到过问题)