如何更新pytest的源文件?

Jac*_*ock 8 python

pytest 似乎正在使用旧的源代码并因此导致测试失败。我不知道如何更新它。

测试代码:

from nba_stats import league


class TestLeaders():
    def test_default():
        leaders = league.Leaders()
        print(leaders)
Run Code Online (Sandbox Code Playgroud)

源代码(league.py):

from nba_stats.nba_api import NbaAPI
from nba_stats import constants


class Leaders:
...
Run Code Online (Sandbox Code Playgroud)

当我在父目录上运行时pytest,收到一条引用旧导入语句的错误。

_____________________________ ERROR collecting test/test_league.py ______________________________
ImportError while importing test module '/home/mfb/src/nba_stats/test/test_league.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test_league.py:1: in <module>
    from nba_stats import league
../../../.virtualenvs/nba_stats_dev/lib/python3.6/site-packages/nba_stats/league.py:1: in <module>
    from nba_stats import _api_scrape, _get_json
E   ImportError: cannot import name '_api_scrape'
Run Code Online (Sandbox Code Playgroud)

我尝试重置我的虚拟环境并通过 pip 重新安装我的包。我需要做什么才能告诉它看到新的导入语句以及为什么会发生这种情况?

编辑:完全删除我的虚拟环境,然后创建一个新的虚拟环境似乎可以解决这个问题,但这似乎是任何进一步的源代码更改都会反复出现的问题。当然一定有一种方法可以不必每次都重置我的虚拟环境吗?

Wim*_*sen 2

看起来您安装了该软件包(如果不是直接安装的话,可能是通过其他东西作为依赖项),并且还在本地克隆了它以进行开发。您可以查看本地可编辑安装(https://pip.pypa.io/en/stable/reference/pip_install/#editable-installs),但就我个人而言,我更喜欢让测试直接引用它所在的包正在运行,从那时起它可以在克隆后“按原样”使用。通过修改sys.path您的test_league.py. 即,假设它具有一个包含 python 代码的结构python/nba_stats,位于 `test 的父目录中

sys.path = [os.path.join(os.pardir, 'python')] + sys.path
Run Code Online (Sandbox Code Playgroud)

在顶端test_league.py。这会将您的本地软件包放在前面并import首先考虑它。

编辑: 既然你尝试过,但它仍然不起作用(请确保上面的代码片段确实指向实际结构中的本地python包;上面只是一个常见的,但你可能有不同的结构),在这里您可以通过以下方式查看按顺序考虑哪些目录以及最终选择哪些目录:

python -vv -m pytest -svx
Run Code Online (Sandbox Code Playgroud)

您将能够查看 sys.path 中是否存在虚假目录、尝试的目录(如上面的代码片段中所示)是否与预期匹配、拾取的任何剩余 .pyc 文件等。

EDITv2:既然您说python -m pytest可以,但pytest不行,请看看该pytest可执行文件来自哪里which pytest。很可能它是一个系统,它引用的系统python与您的virtualenv. 要查看它选择了哪个 python,请执行以下操作:

cat `which python`
Run Code Online (Sandbox Code Playgroud)

然后看顶行。

如果这与给你的不一样which python(激活了你想要的 virtualenv),你可能需要安装pytest当前的 virtualenv ( python -m pip install pytest)。