[英]pytest integration - how to properly import
我正在使用py.test
來測試我的 python 代碼。 我的項目的相關結構是
-myproject
file.py
file2.py
-test/
input.txt
input2.dat
test_part.py
-regress/
file2_old.py
__init__.py
-test/
test_file2_regression.py
test_part.py
導入file
和file2
, test_file2_regression.py
導入file2
和regress.file2_old
。 如果我在控制台中運行pytest
, pytest
出現導入錯誤,即包不存在。 另一方面,運行python -m pytest
工作得很好,但python -m pytest
是我從myproject/
目錄運行它。
這樣做的正確方法是什么,讓它在我的項目中的任何地方工作? 我已經嘗試修改PYTHONPATH
但老實說我不知道如何正確地做到這一點。
更多信息:
我沒有任何設置文件,我的__init__
只是空文件。 如果操作PYTHONPATH
是必要的,它需要相對於myproject
來完成,因為我在多台機器上使用它。 我正在運行 python 2.7。
我已經簽出:
但它並沒有真正幫助我。
與項目中任何目錄中的pytest
命令一起使用的解決方案是在test*.py
文件中的導入之前包含:
import os
from sys import path
PATH = os.path.abspath(os.path.dirname(__file__))
path.append(os.path.join(PATH, os.pardir, os.pardir))
其中適當數量的os.pardir
用於導航到項目目錄,從那里__init__.py
文件允許導入模塊。
argv[0]
和inspect.getsourcefile
都不提供必要的信息。 argv[0]
包含使用的py.test
模塊的位置, getsourcefile
方法只返回None
。
編輯:從 Python 3.4 開始,我們可以使用現代pathlib
代替os.path
:
from pathlib import Path
from sys import path
PATH = Path(__file__).resolve()
path.append(PATH.parents[2])
在尋找“這樣做的最佳方法”時遇到了同樣的問題和類似的成功,我自己總結為盡可能避免這種情況(因此從頂層運行實際腳本),但為了回答你的問題,我目前的方法(例如從並行文件夾進行單元測試)是
from sys import argv, path
from os.path import dirname, join
path.append(join(dirname(argv[0]), ".."))
這使得解釋器也在上面啟動腳本的文件夾中搜索。 另一種方法(而不是使用argv
)是使用introspect
模塊來獲取文件名。 這些對我來說比使用__file__
更好,因為后者並不總是被定義。
編輯 29.10。:替代argv[0]
是使用
from inspect import getsourcefile
from sys import path
from os.path import dirname, join
this_file = getsourcefile(lambda _: None)
path.append(join(dirname(this_file), ".."))
我希望這至少可以達到要求的目的,另請參閱如何在 Python 中獲取當前執行文件的路徑? .
最簡單的 - 如果它適用於您的情況 - 當然是:
from os.path import dirname, join
path.append(join(dirname(__file__), ".."))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.