Python 3相对导入完整模块

时间:2018-03-07 00:56:37

标签: python python-3.x python-2.7 import

我正在尝试使Python 3兼容的代码。据我所知,在Python 3中,从同一个包导入模块必须是相对的。所以如果这是目录结构:

/package
    /modA
    /modB

有很多现有代码看起来像这样(在modA中):

import modB
modB.some_function()

有没有办法更改导入,所以我可以继续以相同的方式调用方法/属性?

我知道你可以这样做:

from .modB import some_function
some_function()

但我想尽可能避免更改所有电话。当我这样称呼时:

import .modB

它出错了

3 个答案:

答案 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>