簡體   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