[英]How to import without using sys.path?
我有一个这样组织的python3项目:
project
src
__init.py__
file1.py (contains Class1)
file2.py (contains Class2)
test
test1.py (contains TestClass1)
test2.py (contains TestClass2)
我希望能够将类从file1.py
导入file2.py
并从file1.py
或file2.py
导入test1.py
和test2.py
。 在不设置sys.path
的情况下完成此任务的最直接方法是什么?
我正在使用 python 3.7。
代码被称为:
cd project/src/ && python3 file2.py
并作为:
cd project/ && python3 -m unittest discover
这是一个开源项目,因此欢迎任何想要的人访问我们的 GitHub 存储库的 URL,但我希望它与问题无关。
这应该不难,但它让我很适应。 我已阅读Python3 导入章节并搜索了规范的 Python 项目组织,但无济于事。
__init__.py
Python 使用__init__.py
文件的存在来确定哪些目录是 Python 包。 如果您像这样在项目中添加这些:
project
__init__.py
src
__init__.py
file1.py (contains Class1)
file2.py (contains Class2)
test
__init__.py
test1.py (contains TestClass1)
test2.py (contains TestClass2)
您应该能够通过导入路径从测试中导入源代码: from project.src.file1 import Class1
。
然后运行您的测试: python -m unittest discover -s /path/to/project/test
setuptools
您可以使用setuptools
安装源代码,然后运行如下内容:
cd project/ && python3 -m pip install . && python3 -m unittest discover
您只需要将setup.py
文件添加到项目的根目录。 对于简单的setup.py
脚本,您可能需要参考https://github.com/google/mobly/blob/master/setup.py (我曾经使用过很多次的项目)。 有很多项目使用setuptools
,但其中许多都进行了非常复杂的设置,而且通常很难确切地看到发生了什么。
这就是我最终得到的结果,这要归功于这里的建议和 Alex Martelli 的建议。 秘诀是使用 Python 的-m标志。
project
src
__init.py__
file1.py
class Class1:
pass
file2.py
from src.file1 import Class1
class Class2:
pass
if __name__ == "__main__":
# Instantiate Class2 here…
pass
test
__init.py__
test1.py
from src.file1 import Class1
class TestClass1:
pass
test2.py
from src.file2 import Class2
class TestClass2:
pass
该应用程序被调用为cd project && python3 -m src.file2
测试作为cd project && python3 -m unittest
运行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.