繁体   English   中英

如何在不使用 sys.path 的情况下导入?

[英]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.pyfile2.py导入test1.pytest2.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM