[英]Python library project structure best practice: imports and tests
我想重構一個python庫,我在我的日常工作中使用很多,在github上將它作為開源發布。 在這樣做之前,我希望符合某種python項目結構的最佳實踐。 我將在下面描述想要我想做什么,我將不勝感激您的建議。
這是我的庫(mylib)結構:
mylib/
/examples/
simple_example.py
/mylib/
__init__.py
foo.py
bar.py
/tests/
test_foo.py
test_bar.py
這是文件:
#foo.py
def Foo():
print("foo.Foo")
#bar.py
import foo
def Bar():
print("bar.Bar")
foo.Foo()
#test_bar.py
from ..mylib import bar #doesnt work!
class TestBar(unittest.TestCase):
def test_1(self):
bar.Bar()
self.assertEqual(True, True)
if __name__ == '__main__':
unittest.main()
#simple_example.py
from .. import foo #doesnt work!
from .. import bar #doesnt work!
if __name__ == '__main__':
foo.Foo()
bar.Bar()
我想做的是:
1-理想情況下從/ mylib / examples /執行simple_example.py:
$cd myapp
$cd examples
$python simple_example.py
Traceback (most recent call last):
File "simple_example.py", line 2, in <module>
from .. import foo
SystemError: Parent module '' not loaded, cannot perform relative import
2-理想情況下從/ mylib / tests /執行單個測試文件:
$cd myapp
$cd tests
$python test_bar.py
Traceback (most recent call last):
File "test_bar.py", line 3, in <module>
from ..mylib import bar
SystemError: Parent module '' not loaded, cannot perform relative import
3-從mylib root執行所有測試
$cd myapp
$python -m unittest discover tests #same problem as above!
因此,問題出在simple_example.py和test_bar.py中的import語句中。 修復這些進口的最佳方法是什么?
請注意,我想使用python標准lib unittest進行單元測試。
謝謝
查理
運行測試代碼時,您希望進行絕對導入。 這是因為當您運行單元測試等時,您應該假設您的“庫”以本地開發模式安裝以進行測試 - 不要使用相對導入,因為您不在同一個包中。
以下是在test_foo.py
文件中導入的test_foo.py
,例如:
# test_foo.py
from mylib.foo import Foo
# ... your test code here
通常,您應該只使用庫代碼中的相對導入INSIDE,而不是在您的測試中使用=)
我希望這有幫助。
編輯 :您還需要在開發模式下安裝庫,然后才能工作。 您可以通過以下兩種方式之一完成此操作:
$ python setup.py develop
要么
$ pip install -e .
上述任一命令都將檢查項目的setup.py
文件,該文件告訴Python如何構建/創建包,並將其本地安裝,以便您可以運行測試/混亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.