поэтические зависимости недоступны при запуске скрипта с токсиком - PullRequest
3 голосов
/ 31 января 2020

У меня есть python проект, который использует поэзию и токсик. Он имеет исходный код, тесты и скрипты (блокноты в формате Juptext). Я не могу импортировать зависимости dev в скриптах, но могу в тестах.

Когда я столкнулся с этой проблемой, я создал следующий минимальный пример. Сначала это не сработало, потом я возился с этим, и теперь оно работает. Поэтому я удалил проект, в котором есть реальная проблема, чтобы он не отличался от имени проекта, местоположения, виртуального окружения и каталога. git, но он все еще не работает.

ОБНОВЛЕНИЕ удаление всех артефактов сборки и virtualenv для минимального примера приводит к тому, что он перестает работать снова

ОБНОВЛЕНИЕ добавление строки scripts: poetry install к командам tox исправлено только минимальное значение пример

Исходный код, тесты и сценарии находятся в следующем макете

foo
  +--foo
  |  +--__init__.py
  |
  +--tests
  |  +--__init__.py
  |  +--test_foo.py
  |
  +--scripts
  |  +--foo_script.py
  |
  +--pyproject.toml
  +--tox.ini

Файлы либо пусты, либо имеют следующий вид:

foo_script.py

import requests

test_foo.py

import requests
import pytest

def test():
    assert True

pyproject.toml

[tool.poetry]
name = "foo"
version = "0.1.0"
description = ""
authors = ["foo maker"]

[tool.poetry.dependencies]
python = "^3.7"
requests = "*"

[tool.poetry.dev-dependencies]
pytest = "^4.6"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

tox.ini

[tox]
envlist = test, scripts
isolated_build = true
skipsdist = true

[testenv]
basepython = python3.7
whitelist_externals =
    pytest
    bash
commands =
    test: pytest
    scripts: bash -c 'python3 scripts/*.py'

Когда я запускаю tox, я получаю

test run-test-pre: PYTHONHASHSEED='4126239415'
test run-test: commands[0] | pytest
============================= test session starts ==============================
platform linux -- Python 3.6.9, pytest-5.2.1, py-1.8.0, pluggy-0.13.0
cachedir: .tox/test/.pytest_cache
rootdir: /home/#######/foo
collected 1 item                                                               

tests/test_foo.py .                                                      [100%]

============================== 1 passed in 0.09s ===============================
scripts run-test-pre: PYTHONHASHSEED='4126239415'
scripts run-test: commands[0] | bash -c 'python3 scripts/*.py'
Traceback (most recent call last):
  File "scripts/foo_script.py", line 1, in <module>
    import requests
ModuleNotFoundError: No module named 'requests'
ERROR: InvocationError for command /bin/bash -c 'python3 scripts/*.py' (exited with code 1)
___________________________________ summary ____________________________________
  test: commands succeeded
ERROR:   scripts: commands failed

Ответы [ 3 ]

0 голосов
/ 04 февраля 2020

Я считаю, что что-то вроде следующего должно работать:

pyproject.toml

[tool.poetry]
name = "foo"
version = "0.1.0"
description = ""
authors = ["foo maker"]

[tool.poetry.dependencies]
python = "^3.7"
requests = "*"
#
pytest = { version = "^4.6", optional = true }

[tool.poetry.extras]
test = ["pytest"]

# [tool.poetry.dev-dependencies]
# use 'test' extra instead

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

tox.ini

[tox]
envlist = test, scripts
isolated_build = true

[testenv]
basepython = python3.7
whitelist_externals =
    pytest
    bash
extras =
    test
commands =
    test: pytest
    scripts: bash -c 'for f in scripts/*.py; do python "$f"; done'
0 голосов
/ 10 февраля 2020

При условии, что вы установили поэзию, а токсы и pytest являются зависимостями в вашем pyproject.yml (примечание poetry run, см. https://python-poetry.org/docs/cli/#run):

[tox]
envlist = py37
isolated_build = True
skipsdist = True

[testenv]
whitelist_externals = poetry
commands=
    poetry run pytest

при желании вы можете сделать установка происходит при запуске тестов путем изменения последнего бита на (но тогда вам понадобится установить токсик вне поэзии, что может вызвать проблемы в дальнейшем)

commands=
    poetry install
    poetry run pytest

Также в зависимости от вашего root папку и где тесты вы можете настроить путь для токса, чтобы изменить каталог, добавив

changedir = tests

В этом случае весь файл будет выглядеть так, если вы находитесь в каталоге foo, выполняющем tox:

[tox]
envlist = py37
isolated_build = True
skipsdist = True

[testenv]
whitelist_externals = poetry
commands=
    poetry run pytest
changedir = tests
0 голосов
/ 01 февраля 2020

Сначала мне нужно установить зависимости с poetry install. Затем добавьте poetry run в начало команды, чтобы включить зависимости. Кроме того, при запуске python таких сценариев будет запускаться только первый, передавая имена других в качестве аргументов первой программе. Вместо этого используйте for f in scripts/*.py; do python "$f"; done (см. здесь )

Все вместе

poetry install
poetry run bash -c 'for f in scripts/*.py; do python "$f"; done'

Это заняло гораздо больше времени, чем я хочу думать о

...