防止python覆盖包括虚拟环境站点包

Posted

技术标签:

【中文标题】防止python覆盖包括虚拟环境站点包【英文标题】:preventing python coverage from including virtual environment site packages 【发布时间】:2015-11-16 14:04:07 【问题描述】:

我是报道新手,遇到了一个奇怪的问题。我的报道将我的虚拟环境站点包考虑在内。 这是覆盖运行的输出:

coverage run test.py
....................
----------------------------------------------------------------------
Ran 20 tests in 0.060s

OK
(atcatalog)- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -jmfrank63@fullstack-audio-text-catalog:~/workspace (git master)       [19:58:45]
$ coverage report
Name                                                                              Stmts   Miss  Cover
-----------------------------------------------------------------------------------------------------
/home/ubuntu/Envs/atcatalog/lib/python2.7/site-packages/flask/__init__               18      0   100%
/home/ubuntu/Envs/atcatalog/lib/python2.7/site-packages/flask/_compat                38     20    47%
/home/ubuntu/Envs/atcatalog/lib/python2.7/site-packages/flask/app                   528    255    52%
/home/ubuntu/Envs/atcatalog/lib/python2.7/site-packages/flask/blueprints            156    118    24%
                             .
                             .
                             .
/home/ubuntu/Envs/atcatalog/lib/python2.7/site-packages/werkzeug/urls               412    215    48%
/home/ubuntu/Envs/atcatalog/lib/python2.7/site-packages/werkzeug/utils              242    175    28%
/home/ubuntu/Envs/atcatalog/lib/python2.7/site-packages/werkzeug/wrappers           568    298    48%
/home/ubuntu/Envs/atcatalog/lib/python2.7/site-packages/werkzeug/wsgi               448    352    21%
atcatalog/__init__                                                                    7      0   100%
atcatalog/views/__init__                                                              0      0   100%
atcatalog/views/publang                                                               7      0   100%
atcatalog/views/pubtext                                                               1      0   100%
atcatalog/views/userlang                                                             13      0   100%
atcatalog/views/users                                                                 5      0   100%
atcatalog/views/usertext                                                             14      0   100%
test                                                                                120      0   100%
-----------------------------------------------------------------------------------------------------
TOTAL                                                                             12530   8044    36%
(atcatalog)- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -jmfrank63@fullstack-audio-text-catalog:~/workspace (git master)       [19:58:55]

这是我的项目目录的结构,它位于 home 下:

workspace/
├── README.md
├── atcatalog
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── static
│   ├── templates
│   └── views
│       ├── __init__.py
│       ├── __init__.pyc
│       ├── publang.py
│       ├── publang.pyc
│       ├── pubtext.py
│       ├── pubtext.pyc
│       ├── userlang.py
│       ├── userlang.pyc
│       ├── users.py
│       ├── users.pyc
│       ├── usertext.py
│       └── usertext.pyc
├── requirements.txt
├── run.py
└── test.py

我最初在项目目录中拥有虚拟环境,现在使用 virtualenvwrapper 将其移出 ~/Envs,但问题仍然存在。 run.py 和 test.py 在任何方面都没有什么特别之处,它们都从 atcatalog 导入应用程序。 我也试图找到省略虚拟环境目录的方法,但谷歌没有给出答案(令人惊讶)。 我不认为覆盖的目的是测试已经经过良好测试的站点包。所以我会将他们排除在运行之外。

在测试我的站点包时,我如何才能避免覆盖?

【问题讨论】:

我会尝试使用 py.test 覆盖。 当然可以选择切换到不同的测试框架。但这并不能解释这里出了什么问题。没有教程显示这种行为。并且没有其他人遇到此问题的记录。我可能做错了什么愚蠢的事情。 移动虚拟环境时,是否删除了旧环境? ls -a in workspace/的结果是什么 是的,旧的被删除了。我也摆脱了 .coverage 文件。输出还显示覆盖率正在使用我的新虚拟环境,这显然在我的项目目录之外。 你读过这个吗? coverage.readthedocs.org/en/coverage-4.0b1/source.html#source 【参考方案1】:

感谢tknickman 我想通了:使用任一

coverage run --source <path to project dir> test.py

或创建一个配置文件 .coveragerc,它位于您运行覆盖的目录中,内容如下:

[run]
source =
    <path to project dir>

这意味着您没有在项目目录下安装虚拟环境。 如果您在项目目录下安装了虚拟环境,则可以使用

coverage run --source <project path> --omit <pattern> test.py

请注意,省略需要像这样的文件模式

~/projectdir/venv/*

而不是路径。

对应的 .coveragerc 如下所示:

[run]
source=
    <path to project dir>
omit=
    <path to project dir>/<name of virtual env>/*

我仍然认为,像标准库的包一样,任何安装在 site-packages 下的包都不应该被默认覆盖。

【讨论】:

你好@JohannesMariaFrank,我的文件夹中有我的python文件,里面是venv - 试图运行它,但我不知道该放什么作为 因为我在文件所在的那个文件夹中运行它 - 所以对我没有任何作用,如果我创建 .coveragerc 文件 - 我仍然不知道该放什么作为 - 我应该放“” - 像空字符串还是?谢谢 嗨@Radek 绝对路径应该很好,事实上~/projectdir/venv 是一个绝对路径,因为~ 解析为/home/radekC:\Users\radek 我按照你说的做了@JohannesMariaFrank 并得到了这个错误:Can't find '_ main _' module in '/[path-to-my-directory] /venv/include' 嗨@Radek听起来像***.com/questions/24723547/… 顺便说一句,如果您的.coveragerc 文件位于同一位置,则在您的.coveragerc 文件中执行source=. omit=./venv/*【参考方案2】:

尝试使用py.test,然后在 setup.cfg 文件中指定您的测试选项。您需要先 pip install pytest。

例如:

[pytest]
norecursedirs = build docs/_build *.egg .tox *.venv
python_files = tests/functional* tests/integration*
addopts =
    #--verbose
    --tb short
    # Turn on --capture to have brief, less noisy output
    # You will only see output if the test fails
    # Use --capture no if you want to see it all or have problems debugging
    --capture fd
    # --capture no
    # show extra test summary info as specified by chars (f)ailed, (E)error,      (s)skipped, (x)failed, (X)passed.
    - rfEsxX
    --junitxml junit.xml
    --cov workspace --cov-report xml --cov-report term-missing

您可以在此处阅读有关配置 py.test 的更多信息:https://pytest.org/latest/customize.html

【讨论】:

这个答案与关于coverage.py而不是py.test的原始问题没有任何关系。【参考方案3】:

在您的setup.cfg 文件中包括:

[coverage:run]
omit=*/site-packages/*,*/tests/*,*/.eggs/*

或任何其他显示在您的结果中但您希望隐藏的文件夹。

【讨论】:

【参考方案4】:

如果使用pytest,可以在setup.cfg(see docs)中指定专用路径或文件进行测试:

[pytest]
# a directory
testpaths = tests

# exact file(s)
python_files = tests/test1.py tests/test2.py

看起来如果包含python_filestestpaths 参数,则只会使用python_files

【讨论】:

testpaths = tests - tests 是一个文件夹吗?

以上是关于防止python覆盖包括虚拟环境站点包的主要内容,如果未能解决你的问题,请参考以下文章

python虚拟环境的搭建

python虚拟环境搭建

虚拟环境搭建

虚拟环境 - 搭建 | pycharm使用虚拟环境

2.虚拟环境搭建

虚拟环境的搭建