[英]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.