Python: тестирование и загрузка разных git коммитов одного и того же пакета - PullRequest
1 голос
/ 14 марта 2020

У меня есть пакет python на github, и я могу установить его различные версии коммита, например, pip3 install git+https://github.com/my/package@commithash. Я хотел бы сравнить различные коммиты друг с другом, в идеале сравнивая две версии в одном и том же скрипте python, чтобы я мог построить метрики из разных версий друг против друга. Для меня самый очевидный способ сделать это - установить несколько разных версий одного и того же пакета одновременно и получить к ним доступ с использованием синтаксиса, например,

import mypackage_commithash1 as p1
import mypackage_commithash2 as p2

results1 = p1.do_something()
results2 = p2.do_something()

plot_comparison(results1, results2)

Но, насколько я вижу, python не поддерживает несколько пакетов с одинаковыми именами, как это, хотя https://pypi.org/project/pip3-multiple-versions до некоторой степени. У кого-нибудь есть предложения по go выполнению подобных сравнений в сценарии python?

1 Ответ

1 голос
/ 15 марта 2020

Это слишком широкий вопрос, чтобы дать четкий ответ ...

При наличии двух версий одного и того же проекта, работающих в одной среде, один и тот же сеанс интерпретатора труден, почти невозможен.

Сначала, возможно, взгляните на этот потенциально связанный вопрос:

1. После прочтения вашего вопроса на ум приходит другое решение: установить две версии проекта в двух разных виртуальных средах. Затем в третьей виртуальной среде я запускал код, который выглядит следующим образом (вид непроверенного псевдокода, потребуется некоторая подстройка):

environments = [
    'path/to/env1',
    'path/to/env2',
]

results = []
for environment in environments:
    output = subprocess.check_output(
        [
            environment + 'bin/python',
            '-c',
            'import package; print(package.do_something())',
        ],
    )
    results.append(parse_output(output))

plot_comparison(results)

2. Другой подход - в конечном итоге использовать tox для запуска тестовой программы в разных средах, содержащих каждую свою версию проекта. Затем создайте дополнительную среду для запуска кода, который будет интерпретировать и сравнивать результаты (возможно, записанные в файловой системе?).

3. Может быть, можно попытаться взломать что-нибудь вместе с importlib. Установите 2 версии под 2 различными путями (pip install --target ...). Затем в тестовом коде, что-то вроде этого:

  • изменить sys.path, чтобы включить путь, содержащий версию 1
  • import (может быть, importlib может помочь)
  • запустить тест 1
  • изменить sys.path, чтобы удалить путь, содержащий версию 1, и включить путь, содержащий версию 2
  • , снова импортировать (возможно, importlib.reload необходимо)
  • запустить тест 2
  • сравнить результаты
...