没有相对路径的 Python3 导入模块

Python3 import module without relative path

提问人:user1722361 提问时间:10/25/2023 更新时间:10/25/2023 访问量:49

问:

我有一个包含以下 py 文件的文件夹测试

mytest/
- test.py
- utility.py
- pb2.py
- pb2_grpc.py

pb2 和 pb2_grpc 由 Python gRPC 工具生成。

在 test.py,有

import utility
import pb2
import pb2_grpc

在pb2_grpc.py,有

import pb2

当我cd到mytest目录并执行时

python -m unittest test.py

一切都很好。但是现在我需要在父目录中执行测试,然后当我这样做时遇到了“没有模块命名”错误

python -m unittest mytest/test.py

然后我改成,它有效。但是对于那些自动生成的文件,我无法编辑它们。import utilityfrom . import utility

我现在唯一能做的就是添加我的 test.py,然后当调用pb2_grpc时,它知道在哪里可以找到 pb2。但是有没有更好的方法可以做到这一点呢?os.append.path(os.path.dirname(__file__))

python-3.x python模块

评论

0赞 sahasrara62 10/25/2023
您可以在生成的 Protobuf 文件中编辑导入

答:

0赞 low_static 10/25/2023 #1

许多相对导入问题可以通过添加一个空的 init.py 文件并使目录成为包来解决,导入的包结构似乎在相对导入方面更好,唯一的区别是而不是你运行它,这可能无法解决问题,或者你可能不想将目录变成一个模块,但它值得一试python -m unittest mytest/test.pypython -m unittest mytest.test

0赞 tdelaney 10/25/2023 #2

unittest可以以多种方式运行。您可以对测试脚本进行编码,以调用它并将其作为 运行。或者,您可以运行并让它将您的测试作为 python 模块导入。你正在做第二个。unittest.main()python mytest/test.pyunittest

运行时,将 “mytest/test.py” 替换为 “mytest.test” 并导入该模块。你可以很容易地写.python -m unittest mytest/test.pyunittestpython -m unittest mytest.test

要加载模块,该目录必须位于 python 路径中。这是通常应该在 python 之外的环境中完成的任务。mytest

如果你正在运行一个类似 bash 的 shell,并且你位于 mytest 目录的父目录中,你可以这样做

PYTHONPATH=mytest:$PYTHONPATH python -m unittest test

另一个不错的选择是使整个项目可安装。然后,您可以运行测试。pip install --editable .

更好的是,创建一个 python 虚拟环境,您可以在其中运行测试。