簡體   English   中英

測試和python包結構

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM