Python 3相对导入完整模块

问题描述 投票:0回答:3

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

/package
    /modA
    /modB

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

import modB
modB.some_function()

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

我知道你可以这样做:

from .modB import some_function
some_function()

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

import .modB

它给出了一个错误

python python-3.x python-2.7 import
3个回答
2
投票

从同一个包中相对导入模块modB的语法是

from . import modB

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()

-1
投票

你可以使用importlib

import importlib

然后

modB = importlib.import_module('package.modB')

...如果你的相对路径导入存在持久性问题,那么它是不是最优的但仍然是一个可行的选择(永远不会遇到POSIX和OSx上的问题,但我在NT平台上遇到过问题)

© www.soinside.com 2019 - 2024. All rights reserved.