重新导入同名

时间:2017-01-15 06:55:22

标签: python python-2.7

我有一个python项目,需要能够运行外部脚本。

这些脚本在具有多个模块的目录结构中动态导入。

现在,由于这些脚本是独立编写的,并且彼此不了解,因此它们通常使用相同的模块名称。

这使我在逐个导入它时会出现问题。

例如,这是我的目录结构:

  • main.py
    • 一个
      • a.py
      • utils.py
    • b
      • b.py
      • utils.py

所以我在根文件夹中有一个main.py脚本,在a和b文件夹中有两个“外部”脚本。

两个脚本都使用不同的utils.py模块。

a / a.py的内容:

import utils
utils.hello()

/ utils.py的内容:

def hello():
    print 'hello from a'

b / b.py的内容:

import utils
utils.hello()

b / utils.py的内容:

def hello():
    print 'hello from b'

main.py的内容

import sys
sys.path.append('a')
import a
sys.path.append('b')
import b

现在,此示例打印:

hello from a
hello from a

我显然需要打印:

hello from a
hello from b

由于我不负责“外部”脚本,我无法修改它们,有什么方法可以实现这个目标吗?

修改

使用@ moinuddin-quadri导入的答案如下:从导入中确实适用于这个简单的例子,但是这个:

  • main.py
    • 一个
      • a.py
      • LIB
        • utils.py
      • LIB2
        • utils2.py
    • b
      • b.py
      • LIB
        • utils.py
      • LIB2
        • utils2.py

每个utils.py正在做的事情:

来自lib2 import utils2

为此,我需要将根脚本文件夹放在sys.path

当b / lib / utils尝试运行时:从lib2 import utils2,它在/ lib2中接收utils2

2 个答案:

答案 0 :(得分:2)

您应该在 a.py b.py 中使用相对导入。所以,你的导入应该是:

from . import utils

表示来自当前目录的,导入工具。这样你就可以让你的python程序在 a / a.py 中导入 a / utils.py 并在 b / utils.py > b / b.py

首先在__init__.py的目录中创建main.py(假设__init__.pya中已存在b),然后导入a和b in main.py as:

from a import a   # No need to do `sys.path.append('a')`
from b import b

# For importing utils.py  (if needed)
from a import utils as a_utils
a_utils.hello()

from b import utils as b_utils
b_utils.hello()

同时阅读:

答案 1 :(得分:0)

通常,要导入模块,我们不需要使用sys.path:

<强> main.py

from a import a
# first 'a' is the directory. second 'a' is a.py
# the 'a' directory needs to have __init__.py which can be blank
from b import b

<强>一个/ a.py

from . import utils

<强> B / b.py

from . import utils

由于无法修改外部模块,因此可以在导入模块时重命名具有相同名称的模块:

<强> main.py

from a import utils as utils_a
from b import utils as utils_b

utils_a.hello()
utils_b.hello()