簡體   English   中英

pytest 集成 - 如何正確導入

[英]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導入filefile2test_file2_regression.py導入file2regress.file2_old 如果我在控制台中運行pytestpytest出現導入錯誤,即包不存在。 另一方面,運行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.

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