我正在尝试使Python 3兼容的代码。据我所知,在Python 3中,从同一个包导入模块必须是相对的。所以如果这是目录结构:
/package
/modA
/modB
有很多现有代码看起来像这样(在modA中):
import modB
modB.some_function()
有没有办法更改导入,所以我可以继续以相同的方式调用方法/属性?
我知道你可以这样做:
from .modB import some_function
some_function()
但我想尽可能避免更改所有电话。当我这样称呼时:
import .modB
它出错了
答案 0 :(得分:2)
从同一个包中相对导入模块modB
的语法是
from . import modB
答案 1 :(得分:0)
这扩展了@ 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()
答案 2 :(得分:-1)
你可以使用importlib
import importlib
然后
modB = importlib.import_module('package.modB')
......如果你在相对路径导入方面遇到持久性问题(从不在POSIX和OSx上遇到过问题,但在NT平台上我遇到过),那么它是不是最优的,但仍然是一个可行的选择< / p>