我切换当前使用的一个项目pipenv,以poetry作为一个测试,看看差别是什么。该项目是一个简单的、可再分发的 Django 应用程序。它支持 Python 3.6-8,以及 Django 2.2 和 3.0。我有一个tox.ini文件,涵盖了 Python 和 Django 的所有组合,因此:
[tox]
envlist = py{36,37,38}-django{22,30}
[testenv]
whitelist_externals = poetry
skip_install = true
deps =
django22: Django==2.2
django30: Django==3.0
commands =
poetry install -vvv
poetry run pytest --cov=my_app tests/
poetry run coverage report -m
Run Code Online (Sandbox Code Playgroud)
我遇到的问题(pipenv世界上不存在)是该poetry install语句将始终用文件中的任何内容覆盖该deps部分中的任何内容poetry.lock(如果它不存在,它将自动生成)。这意味着测试矩阵永远不会针对 Django 2.2 进行测试 - 因为默认情况下每个 tox virtualenv 都会安装 Django 3.0。
我不明白这应该如何工作 - 是否应该使用poetry尊重正在安装的现有环境来安装依赖项?
所以 - 我的问题是 - …
我试图py.test在我的包上运行,但它试图setup.py从项目根目录解析,即使我试图排除它.
我需要从*.py文件中收集测试,因为测试类包含在模块中.
# setup.cfg
[pytest]
norecursedirs = .svn _build tmp* lib/third lib *.egg bin distutils setup.py
python_files = *.py
Run Code Online (Sandbox Code Playgroud)
还是当我跑的py.test时候会给我ERROR collecting setup.py我已经排除的东西.
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/core.py:140: in setup
> raise SystemExit, gen_usage(dist.script_name) + "\nerror: %s" % msg
E SystemExit: usage: py.test [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E or: py.test --help [cmd1 cmd2 ...]
E or: py.test --help-commands
E or: py.test cmd --help
E
E error: no commands supplied
Run Code Online (Sandbox Code Playgroud) 我们有一个启用tox的项目(我们称之为"主"项目),它依赖于另一个tox项目(我们称之为"库"项目) - 所有项目都集成在一个存储库中,因为它是一个大型总体项目的一部分.
该项目如何为普通用户工作
对于作为最终用户的常规安装,您只需先从存储库或任何来源安装"library"然后"main",然后运行它.
我们的问题是tox
但是,作为开发人员,情况有所不同,因为"tox"应该可以工作,并且您可能希望同时拥有多个版本.
您通常检查大型总体存储库,然后文件系统布局是这样的:
overarchingproject/main/
overarchingproject/main/src/
overarchingproject/main/tox.ini
overarchingproject/main/setup.py
...
overarchingproject/library/
overarchingproject/library/src/
overarchingproject/library/tox.ini
overarchingproject/library/setup.py
...
Run Code Online (Sandbox Code Playgroud)
现在如果我进入main /并输入"tox",就会发生这种情况:
当前行为:它将尝试构建依赖于"库"的"主"项目 - 这显然会导致尝试从pip获取"库".但是,该项目尚未发布(因此不在点)因此它将无法工作 - 即使lib在同一个回购中就在那里.
结果:它不起作用.
解决方法1:我们可以设置自己的包索引/要求用户这样做.但是,要求每个参与项目的人都使用DevPI或类似工具来运行单元测试似乎不是一个好主意,所以我们需要集中进行.
但是如果我们在某个中心位置提供了一个包索引或者为"库"提供了一个pip包,那么人们就无法通过参与他们自己创建的修改版"库"来轻松地运行"main"测试:
毕竟"库"在同一个存储库中,所以人们不妨在某个时候修改它.
在"主"项目文件夹中键入"tox"将不会轻易获取当前相邻的"库"版本,但只有预先打包的在线内容并不完全直观.
解决方法2:我们尝试了sitepackages = True并在系统中安装"library" - 但是,sitepackages = True导致了我们显着的麻烦,一般来说这似乎不是一个好主意.
期望的行为:我们希望tox在相同的总体存储库中使用该文件夹中的"库"的本地版本,人们通常会在一个存储库中获得:
该版本可能更新,甚至可能在本地修改,因此这显然是开发用户想要使用的版本.它存在,现在不能说关于pip包.
为什么我们仍然希望使用子项目("main","library",...)而不仅仅是一个项目的总体存储库?
我们开发了一个多守护进程大型项目,其中包含许多用于各种目的的守护进程,在一些库中共享代码以形成大学课程管理系统(处理论坛,课程管理,可以提交事物,附加代码版本系统用于学生项目等等.).
可以只使用守护进程的子集,因此它们是单独的项目是有意义的,但它们仍然足够连接,大多数人都希望拥有大部分 - 因此所有这些都在一个存储库中.
库本身也适用于完全不同的项目,但它通常用于我们的开头 - 因此它就是填充到存储库中的地方.这意味着它总是在给定的相对路径中,但它有单独的tox.ini和单元测试.
TL; DR /摘要
那么,在安装项目时,我们如何让tox在另一个toxable项目文件夹中寻找特定的依赖项而不是pip呢?
当然"main"的常规setup.py安装过程不应该乱用tox或搜索本地磁盘:它应该检查一个特定的相对路径,然后放弃,如果那个不存在(并回退) pip或其他).
如果相对路径可以以某种方式存储在tox.ini中,那么最好.
或者这只是一个非常糟糕的主意?我们是否应该以不同的方式解决这个问题,以使我们的"主要"项目能够轻松地使用本地存储库中存在的最新本地开发版"库"?
我一直在学习如何在tox中为我的python项目进行测试.
我有(应该是)一个相当标准的tox初始化文件,如下所示:
[tox]
envlist=py27,flake8
...
[testenv:flake8]
deps=flake8
commands=flake8 library # 'library' is temp. name of project
Run Code Online (Sandbox Code Playgroud)
一切看起来都很正常,所有测试工作,甚至flake8输出都通过(下面的输出).但是,tox引发了一个InvocationError(它在使用pylint进行测试时也是如此)
flake8 recreate: /Users/shostakovich/projects/project_templates/library/.tox/flake8
flake8 installdeps: flake8
flake8 inst: /Users/shostakovich/projects/project_templates/library/.tox/dist/library-0.1.0.zip
flake8 installed: flake8==2.4.1,library==0.1.0,mccabe==0.3,pep8==1.5.7,pyflakes==0.8.1,wheel==0.24.0
library/__main__.py:12:1: F401 'os' imported but unused
library/__main__.py:13:1: F401 're' imported but unused
...
ERROR: InvocationError: '/Users/shostakovich/projects/project_templates/library/.tox/flake8/bin/flake8 library'
Run Code Online (Sandbox Code Playgroud)
我在MaxOSX 10.9.5上运行tox 2.0.2.如果我直接调用flake8或pylint(上面显示了flake8的版本),问题就消失了.
我正在尝试为项目编写一个新测试,我只想在tox中测试一个测试.我已经完全确定其他测试都没问题,我不需要每次都运行它们.我发现的唯一建议不起作用
ERROR: InvocationError: could not find executable
Run Code Online (Sandbox Code Playgroud) 我使用python tox为几个版本的python运行python unittest,但是这些python解释器并非在我运行tox的所有机器或平台上都可用.
我如何配置tox,这样只有在python解释器可用时它才会运行测试.
示例tox.ini:
[tox]
envlist=py25,py27
[testenv]
...
[testenv:py25]
...
Run Code Online (Sandbox Code Playgroud)
最大的问题是我确实想要一个自动检测到的python环境列表.
我想让Tox和Conda一起玩好.主要是因为我需要安装很多非python依赖项,并且很容易创建Conda发行版.然后我可以用简单的方式安装所有东西conda install.
但是,我在激活conda环境时遇到了麻烦.
[tox]
envlist = py27
[testenv]
whitelist_externals =
conda
source
py.test
setenv =
PYTHONPATH = {toxinidir}:{toxinidir}/damlarces
install_command =
python build_env.py --conda-env {toxworkdir}/conda {packages}
commands =
source activate {toxworkdir}/conda
py.test --basetemp={envtmpdir}
Run Code Online (Sandbox Code Playgroud)
该python build_env.py --conda-env {toxworkdir}/conda {packages}负责创建环境(如果需要),安装包等的问题来的source activate {toxworkdir}/conda线.我收到一个ERROR: InvocationError: could not find executable 'source'错误.直接在命令行中键入命令可以正常工作.
对于那些有兴趣的人.这build_env.py是在这个要点:https://gist.github.com/JudoWill/70450979353fa2d12823 ...目前它只是安装Python依赖,但在其预期的环境中,它将安装不一定是python库的Conda repo.有什么想法吗?
我使用tox来管理一些测试环境.我有一个依赖(backports.ssl-match-hostname)我无法使用最新版本的pip下载,所以我需要恢复到pip 8.0.3以允许安装工作.
我在我的tox.ini文件中包含了8.0.3版本的pip用于依赖项.
deps=
pip==8.0.3
Run Code Online (Sandbox Code Playgroud)
但是,当我跑
source .tox/py27/bin/activate
Run Code Online (Sandbox Code Playgroud)
并进入虚拟测试环境,然后运行
pip --version
Run Code Online (Sandbox Code Playgroud)
我结束了
8.1.2
Run Code Online (Sandbox Code Playgroud)
但是,在我的tox环境之外,当我运行相同的命令时,我得到了
8.0.3
Run Code Online (Sandbox Code Playgroud)
抓住点子时,tox有什么特别之处吗?为什么我无法指定要用作依赖项的pip版本?
编辑:添加到这个,似乎我能够获取依赖pip == 8.0.3,但对于其他依赖,它们仍然从使用pip == 8.1.2启动的命令运行
所以,我需要首先抓住pip == 8.0.3,然后一旦安装,抓住其他一切.仍然不确定为什么tox以pip == 8.1.2开头
以前我手动使用的Makefile看起来像这样:
.PHONY: all
all: tests
.PHONY: tests
tests: py_env
bash -c 'source py_env/bin/activate && py.test tests'
py_env: requirements_dev.txt setup.py
rm -rf py_env
virtualenv py_env
bash -c 'source py_env/bin/activate && pip install -r requirements_dev.txt'
Run Code Online (Sandbox Code Playgroud)
这有一个很好的副作用,如果我更改了requirements_dev.txt或setup.py,它将重建我的virtualenv.但感觉有点笨重.
我想tox用来做类似的事情.我明白tox有一个--recreate选择,但我宁愿只在我需要时才打电话.
我的新设置是这样的:
# Makefile
.PHONY: all
all: tests
.PHONY: tests
tests:
tox
Run Code Online (Sandbox Code Playgroud)
和
# tox.ini
[tox]
project = my_project
envlist = py26,py27
[testenv]
install_command = pip install --use-wheel {opts} {packages}
deps = -rrequirements_dev.txt
commands =
py.test …Run Code Online (Sandbox Code Playgroud) 我在 GitHub 上有一个带有 tox.ini 文件的项目:
[tox]
envlist = py3
[testenv]
deps = -rrequirements.txt
commands =
pytest --doctest-modules
Run Code Online (Sandbox Code Playgroud)
效果很好。但是当我用“py37”替换“py3”时,它失败并出现错误:
ERROR: py37: InterpreterNotFound: python3.7
Run Code Online (Sandbox Code Playgroud)
据我所知,tox应该支持Python 3.7。这是 github 上的 tox 特有的问题吗?
tox ×10
python ×7
dependencies ×2
setuptools ×2
conda ×1
django ×1
flake8 ×1
github ×1
linux ×1
makefile ×1
pip ×1
pytest ×1
python-2.7 ×1
python-3.7 ×1
setup.py ×1
testing ×1
virtualenv ×1