Python 3:导入具有相同名称的不同python模块

时间:2019-09-26 13:26:13

标签: python python-3.x

我有几个相互独立编写的python项目(例如a,b)。我想创建第三个项目(c),它使用这两个项目的例程,而不会对(a,b)的主要内容进行太多更改。

只要(a.py,b.py)在其各自的项目文件夹中调用时仍然可以工作,则可以对(a,b)中的import语句进行较小的更改。

该问题与先前的帖子(Re-importing different python module with same name)有点类似,但是:

  1. 我正在使用Python 3,因此相对导入的工作方式似乎有所不同。

  2. 我想知道如何替换“ from utils import *”行,如下面的示例所示。

  3. 我在当前工作目录下还有另一个utils.py,在项目a和b中遮盖了另一个utils.py。


例如,我的项目如下:

  • a
    • a.py
    • utils.py
  • b
    • b.py
    • utils.py
  • c
    • main.py
    • utils.py

a / a.py的内容:

import utils
utils.hello()

a / utils.py的内容:

def hello():
    print('hello from a')

b / b.py的内容:

from utils import *
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
import utils

utils.hello()

示例打印(我希望三行分别打印a,b,c):

hello from c
hello from c
hello from c

在我看来,sys.path.insertsys.append并不是导入模块的好习惯,并且随着项目的扩展,可能会使项目容易受到错误的攻击。<​​/ p>

3 个答案:

答案 0 :(得分:3)

  

我正在使用Python 3,因此相对导入不再有效。

不确定您为什么得出这个结论,但是:

在a.py中:

from .utils import hello # the . is important!
hello()

(与b.py和c.py类似)

打印所需的输出

请注意,python 3中的相对导入需要使用from ... import ...语法


编辑:

如果您的main.pyc/中,则需要更改导入路径,因为相对导入不能位于启动python的工作目录上方(这就是为什么导入{{ 1}}或a中的b

您可以更改环境变量c(请参见norok's answer),也可以在PYTHONPATH中进行修改:

main.py

请注意,您仍然需要import sys sys.path.append('..') import b.b # no more errors! utilsa.pyb.py的相对导入。

答案 1 :(得分:1)

我认为您应该使用PYTHONPATH变量,以避免使用sys

a/a.pyb/b.py的内容:

import utils
utils.hello()

X/utils.pyXab中的一个c的内容:

def hello():
    print('hello from X')

c/main.py的内容:

import a.a
import b.b

import utils
utils.hello()

输出(运行时:export PYTHONPATH='$PYTHONPATH:<project_root>'; python main.py):

hello from a
hello from b
hello from c

答案 2 :(得分:0)

向每个文件夹a和b添加一个名为__init__.py的空文件。这会将这些文件夹标记为包。 https://docs.python.org/3/reference/import.html#regular-packages 然后(在将文件夹添加到路径之后),您应该能够将a作为import a.a导入,并且如果需要,您可以将utils.py的a版本导入为import a.utils