Ответ 3
Я заставил tox и conda работать вместе в Windows:
Установка virtualenv
с conda в среде, в которой я использую tox
:
conda install virtualenv
Создание "соединения каталога" символических ссылок из C:\PythonXY с моим реальным путем к среде. Это обходит InterpreterNotFound
-error:
mklink /J C:\PythonXY C:\real\path\to\myPythonXYenv
Я установил Anaconda в E:\Anaconda3 \, а все мои окружения в E:\Anaconda3\envs \, например. E:\Anaconda3\envs\PY27 \
(Смотрите скрипт ниже, чтобы сделать это быстро и легко.)
Шаг 1 - Создайте окружение с помощью conda:
E:\dev> conda create -n py27 python=2.7 --yes
E:\dev> conda create -n py33 python=3.3 --yes
...
E:\dev> conda create -n py36 python=3.6 --yes
Шаг 2 - Создайте все символические ссылки:
E:\dev> mklink /J C:\Python27 E:\Anaconda3\envs\py27
E:\dev> mklink /J C:\Python33 E:\Anaconda3\envs\py33
...
E:\dev> mklink /J C:\Python36 E:\Anaconda3\envs\py36
Примечание: Я вызываю conda create
из каталога на E-диске, поэтому опция --prefix
/-p
не требуется для установки новых сред в E:\Anaconda3\envs \.
Более легкий путь:
Вместо того, чтобы выполнять трудоемкий процесс настройки этого для каждой версии среды /Python, можно использовать ToxEnvMatcher
-class, добавленный ниже таким образом:
my_envs = os.path.join('E:\\', 'Anaconda3', 'envs')
tem = ToxEnvMatcher(my_envs)
for version in '27,34,35,36'.split(','):
tem.make(version)
Изменить. Чтобы упростить использование сценария, я добавил новый раздел в файл file(здесь предполагается, что tox_with_conda.py,), чтобы его можно было вызывать из cmd.exe:
C:\dev> python tox_with_conda.py E:\Anaconda3\envs 27 34 35 36 37
Edit 2: также может быть установлен с pip: pip install tox_with_conda
и использоваться как:
C:\dev> python -m tox_with_conda E:\Anaconda3\envs 27 34 35 36 37
Я использую Python 3.6.3 и tox 2.9.1, но я не знаю, когда/будут ли работать более ранние версии.
Оборона:
Я предполагаю, что для некоторых это кажется слишком громоздким процессом (хотя на самом деле это не так), или для большей части взлома. Но имейте в виду, что возможность использования Anaconda/conda также снижает затраты времени на установку библиотек, пакетов ++++.
Обратите внимание:
- Я использую tox вместе с pytest и не заметил каких-либо последствий для моих тестов.
- Мои тесты просты, и есть вероятность, что я просто еще не столкнулся с проблемами.
- Возможно, есть вещи, о которых я не думал, которые могут быть важны для других.
Класс (также доступен здесь):
from subprocess import run
from os.path import join
DEFAULT_BASE = join('C:\\', 'Python')
class ToxEnvMatcher:
"""
Utility to make conda environments work with tox.
Conda envs might be in other locations than where 'tox <https://tox.readthedocs.io>'_ expects them to be.
A symbolic link 'Directory Junction' is created from expected location to the actual location.
Intended for Windows to get around the ''InterpreterNotFound''-error.
E.g.: tox expects to find Python 2.7 in ''C:\Python27'',
but may actually be installed in another drive and location.
Examples of use:
.. code-block:: python
my_envs = join('E:\\', 'Anaconda3', 'envs')
tem = ToxEnvMatcher(my_envs)
for version in '27,34,35,36'.split(','):
tem.make(version)
The class is utilized through ''argsparse'' so it can also be used from cmd.exe.
Examples of use of th of using ''ToxEnvMatcher'' from cmd.exe:
.. code-block:: none
E:\dev> tox_with_conda.py E:\Anaconda3\envs 27 34 35 36 37
It possible to use the ''-b''/''--base'' option to override the default base location (''C:\Python''):
.. code-block:: none
E:\dev> tox_with_conda.py E:\Anaconda3\envs 27 34 35 36 37 --base D:\Python
:param str envs_dir: The path to where new conda environments will be created
:param str default_base: The base of the 'default' location. Usually it ''C:\Python''
"""
def __init__(self, envs_dir, default_base=DEFAULT_BASE):
self.envs_dir = envs_dir
self.default_base = default_base
def __repr__(self):
return '{}({})'.format(self.__class__.__name__, self.envs_dir)
def make(self, version):
"""
Take version and create conda environment with symlink from 'default tox location'.
E.g.: given version='27' and environment folder ''{self.envs_dir}'':
- ''conda create -p {self.envs_dir}\py27 python=2.7''
- ''mklink /J C:\Python27 {self.envs_dir}\py27''
:param str version: A string on the form 'XY', e.g. '27' or '36'
:return: None
:rtype: NoneType
"""
if len(version) != 2 or not int(version):
raise ValueError("Parameter 'version' must be on the form 'XY', and not '{}'".format(version))
conda_cmd = self._create_cmd_args(version)
symlink_cmd = self._create_symlink_args(version)
run(conda_cmd, shell=True)
run(symlink_cmd, shell=True)
def _get_env_folder(self, version):
return join(self.envs_dir, 'py{}'.format(version))
def _create_cmd_args(self, version):
env_dir = self._get_env_folder(version)
python_version = '.'.join(version)
conda_create = 'conda create -p {} python={} --yes'.format(env_dir, python_version)
return conda_create.split(' ')
def _create_symlink_args(self, version):
env_dir = self._get_env_folder(version)
return 'mklink /J {}{} {}'.format(self.default_base, version, env_dir).split(' ')
Добавлен код для работы с cmd:
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("env_dir",
help="The folder where conda environments should be installed.")
parser.add_argument("versions", nargs='*',
help="The list of versions, formatted 'XY' where X is major and Y minor. E.g. '27 35 36'")
parser.add_argument("-b", "--base", default=DEFAULT_BASE,
help="Base of the path which tox expects to find Python installed. "
"Default: {}.".format(DEFAULT_BASE))
args = parser.parse_args()
print('env_dir: ', args.env_dir)
print('versions: ', args.versions)
print('--base: ', args.base)
tem = ToxEnvMatcher(args.env_dir, default_base=args.base)
for version in args.versions:
tem.make(version)
Ответ 5
Плагин tox-conda в настоящее время должен восполнить этот пробел, но ему нужны участники, которые активно используют conda для его тестирования и улучшения.
от README:
tox-conda
- это плагин, который обеспечивает интеграцию с conda пакетом и менеджером среды для инструмента автоматизации tox. Это все равно, что съесть свой торт и съесть его!
По умолчанию tox
создает изолированные среды с использованием [virtualenv] (https://virtualenv.pypa.io] и устанавливает зависимости от pip
.
Напротив, при использовании плагина tox-conda
tox
будет использовать conda
для создания сред и будет устанавливать указанные зависимости от conda
. Это полезно для разработчиков, которые полагаются на conda
для управления средой и распространения пакетов, но хотят воспользоваться возможностями, предоставляемыми tox
для автоматизации тестирования.
Чтобы установить этот плагин, он должен быть установлен вместе с токсиком в той же виртуальной среде. Для создания виртуальной среды, содержащей tox
и tox-conda
, этого должно быть достаточно:
$ python3 -m venv toxbase
$ toxbase/bin/pip install tox tox-conda
[...]
Successfully installed tox-3.13.2 tox-conda-0.2.0
$ toxbase/bin/tox --version
3.13.1 imported from /home/ob/tmp/toxbase/lib/python3.6/site-packages/tox/__init__.py
registered plugins:
tox-conda-0.2.0 at /home/ob/tmp/toxbase/lib/python3.6/site-packages/tox_conda/plugin.py
С этого момента токсины можно использовать в качестве инструмента командной строки и поддерживать их актуальность, обновив их в toxbase
virtualenv. Другой, более автоматизированный способ - использовать pipx.