提问人:user1722361 提问时间:10/25/2023 更新时间:10/25/2023 访问量:49
没有相对路径的 Python3 导入模块
Python3 import module without relative path
问:
我有一个包含以下 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 utility
from . import utility
我现在唯一能做的就是添加我的 test.py,然后当调用pb2_grpc时,它知道在哪里可以找到 pb2。但是有没有更好的方法可以做到这一点呢?os.append.path(os.path.dirname(__file__))
答:
许多相对导入问题可以通过添加一个空的 init.py 文件并使目录成为包来解决,导入的包结构似乎在相对导入方面更好,唯一的区别是而不是你运行它,这可能无法解决问题,或者你可能不想将目录变成一个模块,但它值得一试python -m unittest mytest/test.py
python -m unittest mytest.test
unittest
可以以多种方式运行。您可以对测试脚本进行编码,以调用它并将其作为 运行。或者,您可以运行并让它将您的测试作为 python 模块导入。你正在做第二个。unittest.main()
python mytest/test.py
unittest
运行时,将 “mytest/test.py” 替换为 “mytest.test” 并导入该模块。你可以很容易地写.python -m unittest mytest/test.py
unittest
python -m unittest mytest.test
要加载模块,该目录必须位于 python 路径中。这是通常应该在 python 之外的环境中完成的任务。mytest
如果你正在运行一个类似 bash 的 shell,并且你位于 mytest 目录的父目录中,你可以这样做
PYTHONPATH=mytest:$PYTHONPATH python -m unittest test
另一个不错的选择是使整个项目可安装。然后,您可以运行测试。pip install --editable .
更好的是,创建一个 python 虚拟环境,您可以在其中运行测试。
评论