Coverage.py Python模块 - 运行脚本时导入错误

时间:2011-08-15 10:01:04

标签: python code-coverage coverage.py

第一个问题,如果我犯了一个菜鸟错误或不清楚的话,请与我一起出去!

我无法让Python的“覆盖”模块正常工作。

我无权修改或添加到Python目录,因此无法安装easy_install来设置覆盖范围。 通过将coverage目录添加到我的python路径来解决这个问题。 覆盖率工作正常,输入covereage --version到shell输出版本。 coverage help显示所有可用命令。一切似乎都很好。 我可以在小的简单脚本上运行覆盖率。

但是,当运行包含5个模块(已经过测试工作的脚本)的大量导入的大型脚本时,在运行带有coverage run [normal commands]的命令时,脚本会执行并失败,因为无法找到某些模块。

这是一个细分 -

没有覆盖的命令行(工作正常):

我通过运行:./script_name.py arg1 arg2 arg3

来调用脚本

当我尝试输入:python script_name.py arg1 arg2 arg3来运行脚本时,脚本失败,无法导入模块:

    Error message:
        ImportError: No module named cx_Oracle

覆盖范围的命令行:

coverage run ./script_name.py arg1 arg2 arg3

    "No file to run: 'main.py'"

coverage run {[full_path_to_module_name}./script_name.py arg1 arg2 arg3

    Now we are getting somewhere. Coverage is clearly invoked and working, put I get that import error:

Error message:
    ImportError: No module named cx_Oracle

有人可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

好消息是,明确地使用“python”运行,并且使用coverage.py会产生相同的结果。坏消息是,结果是错误消息。

您似乎有多个Python安装。一个是“./script_name.py”,另一个是“python ./script_name.py”。

要诊断问题,请将这些行添加到script_name.py:

的顶部
import sys
print sys.executable
print "\n".join(sys.path)

这将显示正在调用的Python可执行文件以及模块的搜索路径。以两种方式运行脚本将显示不同的结果,您应该能够弄清楚发生了什么。

答案 1 :(得分:0)

我认为我也遇到了类似的问题,并设法通过如下方式解决此问题:

python -m coverage run [normal commands]

特别是在我的情况下

python -m coverage run -m unittest discover

这肯定是使用其他python安装的覆盖范围的情况,因为据报告丢失的模块仅安装在我的虚拟环境中,而不安装在我的全局环境中。

答案 2 :(得分:0)

我将补充我的经验,因为有人可能会犯同样的错误。

我正在python虚拟环境(venv)内运行coverage,但未安装coverage。实际上,执行覆盖范围是指我在全球范围内安装的覆盖范围。

通过pip3 install coverage在本地安装python3 -m coverage run myfile.py可以解决该问题。

答案 3 :(得分:0)

我刚刚遇到了一个非常相似的问题,在本地使用以下两种方法对我来说都是有效的:

coverage run

python -m coverage run

因此,每当我运行make unit-test时,在其中一个都可以正常工作,但是当我将代码部署到AWS上的代码构建时,这两个make目标都无法正常工作。

我最终将其归结为以下事实:随着时间的流逝,我已经在本地和本地环境中安装了Coverage,但是在开始使用pyenv时,我也将其安装到了pyenv环境中,所以在本地安装了三个地方。

在构建代理上运行时,实际上我实际上只是将其安装到新的pyenv环境中,因此我必须使用以下语法:

python -m pipenv run coverage run --source=src/app -m pytest -s --junitxml=result.xml src/test/unit/*.py

我想我这个故事的寓意是保持您的工作环境整洁,从现在开始我将尽力做到这一点。

这可能会帮助处于类似情况的人,这就是我要发布的原因。