Python 3:导入同名的不同Python模块

mat*_*hak 5 python python-3.x

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

只要 (a.py, b.py) 在各自的项目文件夹中调用时仍然有效,对 (a, b) 内的导入语句进行细微更改就可以了。

该问题与上一篇文章(重新导入具有相同名称的不同 python 模块)有点相似,但是:

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

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

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


比如我的项目如下:

  • A
    • a.py
    • 实用程序.py
    • b.py
    • 实用程序.py
  • C
    • 主要.py
    • 实用程序.py

a/a.py 的内容:

import utils
utils.hello()
Run Code Online (Sandbox Code Playgroud)

a/utils.py 的内容:

def hello():
    print('hello from a')
Run Code Online (Sandbox Code Playgroud)

b/b.py 的内容:

from utils import *
hello()
Run Code Online (Sandbox Code Playgroud)

b/utils.py 的内容:

def hello():
print('hello from b')
Run Code Online (Sandbox Code Playgroud)

main.py 的内容

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

utils.hello()
Run Code Online (Sandbox Code Playgroud)

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

hello from c
hello from c
hello from c
Run Code Online (Sandbox Code Playgroud)

在我看来,导入模块sys.path.insert并不是sys.append很好的做法,并且随着项目规模的扩大,可能会使项目容易出​​现错误。

GPh*_*ilo 5

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

不知道你为什么得出这个结论,但是:

在a.py中:

from .utils import hello # the . is important!
hello()
Run Code Online (Sandbox Code Playgroud)

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

打印所需的输出

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


编辑:

如果您main.py在 中c/,则需要更改导入路径,因为相对导入不能超出 python 启动的工作目录(这就是为什么如果abc.

您可以更改环境变量PYTHONPATH(请参阅norok的答案),也可以在以下位置执行此操作main.py

import sys
sys.path.append('..')
import b.b # no more errors!
Run Code Online (Sandbox Code Playgroud)

utils请注意,您仍然需要ina.pyb.py的相对导入main.py


nor*_*ok2 1

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

a/a.py和的内容b/b.py

import utils
utils.hello()
Run Code Online (Sandbox Code Playgroud)

的内容X/utils.py与,或X之一:abc

def hello():
    print('hello from X')
Run Code Online (Sandbox Code Playgroud)

内容c/main.py

import a.a
import b.b

import utils
utils.hello()
Run Code Online (Sandbox Code Playgroud)

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

import utils
utils.hello()
Run Code Online (Sandbox Code Playgroud)