Можно ли использовать ток с установкой Python на базе conda?

Инструмент тестирования Python tox, похоже, предназначен для работы с virtualenv. Может ли он также работать с установками Python на базе conda/anaconda?

Ответы

Ответ 1

В то время как ток не может использовать conda, вы можете использовать conda для "установки" разных версий Python, где tox может их найти (например, он найдет "обычные" установки Python в этих папках). В Windows протестировано следующее:

  • Вам нужно virtualenv установить через pip в корневую среду conda. Я подозреваю, что это virtualenv, который будет использоваться токсином. (Мне пришлось установить virtualenv с помощью pip install virtualenv, чтобы команда virtualenv работала, хотя conda list показала ее как установленную.)
  • Установите версии Python, которые вы хотите протестировать. Это легко сделать с помощью conda create. tox автоматически определит двоичные файлы Python в Windows в C:\python27, C:\python33 и т.д., поэтому создайте среды с помощью conda create -p C:\python27 python=2.7 и т.д.

Ответ 2

Да, для этой работы вам понадобится версия conda версии virtualenv.

Try:

>conda install virtualenv

virtualenv                15.1.0                   py36_

Перейдите в каталог проекта, содержащий tox.ini

>tox

Ответ 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)

Ответ 4

Я не знаю, насколько это было развито, но вы можете посмотреть https://github.com/hayd/ctox.

Ответ 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.