我有几个相互独立编写的 python 项目(例如 a、b)。我想创建第三个项目(c),它使用这两个项目的例程,而不会对(a,b)的主要内容进行太多更改。
只要 (a.py, b.py) 在各自的项目文件夹中调用时仍然有效,对 (a, b) 内的导入语句进行细微更改就可以了。
该问题与上一篇文章(重新导入具有相同名称的不同 python 模块)有点相似,但是:
我使用的是 Python 3,因此相对导入的工作方式似乎有所不同。
我想知道如何替换“from utils import *”行,如下例所示。
我在当前工作目录下有另一个 utils.py,遮蔽了项目 a 和 b 中的其他 utils.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
很好的做法,并且随着项目规模的扩大,可能会使项目容易出现错误。
我使用的是 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 启动的工作目录(这就是为什么如果a
您b
在c
.
您可以更改环境变量PYTHONPATH
(请参阅norok的答案),也可以在以下位置执行此操作main.py
:
import sys
sys.path.append('..')
import b.b # no more errors!
Run Code Online (Sandbox Code Playgroud)
utils
请注意,您仍然需要ina.py
和b.py
的相对导入main.py
。
我认为您应该使用该PYTHONPATH
变量以避免使用sys
.
a/a.py
和的内容b/b.py
:
import utils
utils.hello()
Run Code Online (Sandbox Code Playgroud)
的内容X/utils.py
与,或X
之一:a
b
c
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)
归档时间: |
|
查看次数: |
3660 次 |
最近记录: |