[英]Tests and python package structure
我在構建我的python項目時遇到了一些問題。 目前它是同一文件夾中的一堆文件。 我試着像它一樣構造它
proj/
__init__.py
foo.py
...
bar/
__init__.py
foobar.py
...
tests/
foo_test.py
foobar_test.py
...
問題是我無法從內部目錄導入外部目錄中的模塊。 這對測試尤其煩人。
我已經閱讀了關於相對進口的PEP 328和關於主要模塊的相對進口的PEP 366 。 但是這兩種方法都要求基礎包在我的PYTHONPATH中。 確實,我得到以下錯誤
ValueError:在非包中嘗試相對導入。
所以我在測試文件的頂部添加了以下樣板代碼
import os, sys
sys.path.append(os.path.join(os.getcwd(), os.path.pardir))
我仍然得到同樣的錯誤。 什么是正確的方法
編輯根據評論中的要求,我添加了一個失敗的示例導入(在文件foo_test.py
)
import os, sys
sys.path.append(os.path.join(os.getcwd(), os.path.pardir))
from ..foo import Foo
使用-m
開關運行代碼時,當前目錄將添加到sys.path
。 因此,運行測試的最簡單方法是使用以下命令從proj
的父目錄:
python -m proj.tests.foo_test
要使其工作,您需要在tests目錄中包含一個__init__.py
文件,以便將測試正確識別為包的一部分。
我想盡可能使用完整的proj.NAME
包前綴導入模塊。 這是Google Python樣式指南推薦的方法。
允許您保留包結構,使用完整包路徑並繼續開發的一個選項是使用virtualenv並將項目置於開發模式。 您的項目的setup.py
將需要使用setuptools
而不是distutils
來獲取develop
命令。
這樣可以避免上面的sys.path.append
:
% virtualenv ~/virt
% . ~/virt/bin/activate
(virt)~% cd ~/myproject
(virt)~/myproject% python setup.py develop
(virt)~/myproject% python tests/foo_test.py
foo_test.py
使用的位置:
from proj.foo import Foo
現在,當您從virtualenv中運行python
,您的PYTHONPATH
將指向項目中的所有包。 您可以創建一個較短的shell別名來輸入您的virtualenv,而無需鍵入. ~/virt/bin/activate
. ~/virt/bin/activate
每次. ~/virt/bin/activate
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.