Python3:导入同名的不同Python模块
我有几个python项目(例如a、b),它们是彼此独立编写的。我想创建第三个项目(c),它使用这两个项目的例程,而不会对(a,b)的主要内容进行太多更改 如果(a.py,b.py)在各自的项目文件夹中被调用时仍能工作,则可以对(a,b)中的导入语句进行细微更改 问题有点类似于前一篇文章(),但:Python3:导入同名的不同Python模块,python,python-3.x,Python,Python 3.x,我有几个python项目(例如a、b),它们是彼此独立编写的。我想创建第三个项目(c),它使用这两个项目的例程,而不会对(a,b)的主要内容进行太多更改 如果(a.py,b.py)在各自的项目文件夹中被调用时仍能工作,则可以对(a,b)中的导入语句进行细微更改 问题有点类似于前一篇文章(),但: 我使用的是Python3,因此相对导入的工作方式似乎有所不同 我想知道如何替换行“from utils import*”,如下例所示 我在当前工作目录下有另一个utils.py,它隐藏着项目a和b中的其
例如,我的项目如下所示:
- a
- a、 派克
- utils.py
- b
- b、 派克
- utils.py
- c
- main.py
- utils.py
import utils
utils.hello()
a/utils.py的内容:
def hello():
print('hello from a')
def hello():
print('hello from b')
b/b.py的内容:
from utils import *
hello()
b/utils.py的内容:
def hello():
print('hello from a')
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):
在我看来,
sys.path.insert
和sys.append
导入模块不是很好的做法,而且随着项目规模的扩大,可能会使项目容易出现bug。向每个文件夹a和b添加一个名为的空文件。这会将这些文件夹标记为包。
然后(将文件夹添加到路径后),您应该能够将a导入为import a.a
,如果需要,您可以将a的utils.py
导入为import a.utils
我使用的是Python3,因此相对导入不再有效
不知道你为什么会得出这个结论,但是:
在a.py中:
from .utils import hello # the . is important!
hello()
(类似于b.py和c.py)
打印所需的输出
请注意,python 3中的相对导入需要来自的。。。导入…
语法
编辑:
如果main.py
位于c/
中,则需要更改导入路径,因为相对导入不能位于启动python的工作目录之上(这就是为什么在c
中导入a
或b
时会出错的原因)
您可以更改env varPYTHONPATH
(请参阅),也可以在main.py
中执行此操作:
import sys
sys.path.append('..')
import b.b # no more errors!
import utils
utils.hello()
import a.a
import b.b
import utils
utils.hello()
请注意,您仍然需要a.py
、b.py
和main.py
中的utils
的相对导入,我认为您应该使用PYTHONPATH
变量,以避免使用sys
a/a.py
和b/b.py
的内容:
import sys
sys.path.append('..')
import b.b # no more errors!
import utils
utils.hello()
import a.a
import b.b
import utils
utils.hello()
X/utils.py
的内容,带有X
其中一个a
、b
或c
:
def hello():
print('hello from X')
c/main.py的内容
:
import sys
sys.path.append('..')
import b.b # no more errors!
import utils
utils.hello()
import a.a
import b.b
import utils
utils.hello()
输出(运行时:export PYTHONPATH='$PYTHONPATH:';python main.py
):
你好,来自
b你好
你好,c
或者,更确切地说,我只是测试了它,我可以确认\uuu init\uuuuuuuuuy.py
文件在python 3中不是必需的。这给了我一个错误导入错误:尝试在没有已知父包的情况下进行相对导入
如果在控制台中键入,相对导入将不起作用。将其写入a.py
,然后从控制台导入a
我将from.utils import hello
放入a.py
和b.py
并在目录c
中从终端执行main.py。哦,我没有看到main
在c//code>中,我将我的放在根目录中。让我测试这个配置