我有几个相互独立编写的python项目(例如a,b)。我想创建第三个项目(c),它使用这两个项目的例程,而不会对(a,b)的主要内容进行太多更改。
只要(a.py,b.py)在其各自的项目文件夹中调用时仍然可以工作,则可以对(a,b)中的import语句进行较小的更改。
该问题与先前的帖子(Re-importing different python module with same name)有点类似,但是:
我正在使用Python 3,因此相对导入的工作方式似乎有所不同。
我想知道如何替换“ from utils import *”行,如下面的示例所示。
我在当前工作目录下还有另一个utils.py,在项目a和b中遮盖了另一个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.insert
和sys.append
并不是导入模块的好习惯,并且随着项目的扩展,可能会使项目容易受到错误的攻击。</ p>
答案 0 :(得分:3)
我正在使用Python 3,因此相对导入不再有效。
不确定您为什么得出这个结论,但是:
在a.py中:
from .utils import hello # the . is important!
hello()
(与b.py和c.py类似)
打印所需的输出
请注意,python 3中的相对导入需要使用from ... import ...
语法
如果您的main.py
在c/
中,则需要更改导入路径,因为相对导入不能位于启动python的工作目录上方(这就是为什么导入{{ 1}}或a
中的b
。
您可以更改环境变量c
(请参见norok's answer),也可以在PYTHONPATH
中进行修改:
main.py
请注意,您仍然需要import sys
sys.path.append('..')
import b.b # no more errors!
,utils
和a.py
中b.py
的相对导入。
答案 1 :(得分:1)
我认为您应该使用PYTHONPATH
变量,以避免使用sys
。
a/a.py
和b/b.py
的内容:
import utils
utils.hello()
X/utils.py
和X
,a
或b
中的一个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
。