【问题标题】:How do we access the variables set inside the tox environment again in another block of the tox?我们如何在另一个 tox 块中再次访问在 tox 环境中设置的变量?
【发布时间】:2020-03-09 15:55:13
【问题描述】:

我正在使用 tox-docker 并将 POSTGRES_5432_TCP_PORT 设置为环境变量。如何再次访问此环境变量?我想这样做是因为我必须将它提供给 pytest 命令。

[tox]
skipsdist = True
envlist = py37-django22

[testenv]
docker = postgres:9
dockerenv =
    POSTGRES_USER=asd
    POSTGRES_DB=asd
    POSTGRES_PASSWORD=asd

setenv =
    PYTHONDONTWRITEBYTECODE=1
    DJANGO_SETTINGS_MODULE=app.settings.base

deps=-rrequirements.txt
     -rrequirements_dev.txt

commands =
    env
    python -c "print('qweqwe', {env:POSTGRES_5432_TCP_PORT:'default_port'})"
    pytest -sv --postgresql-port={env:POSTGRES_5432_TCP_PORT:} --cov-report html --cov-report term --cov=app -l --tb=long {posargs} --junitxml=junit/test-results.xml

这里,POSTGRES_5432_TCP_PORT 由 tox-docker 设置。但是当我尝试在 tox 中访问它时,它不可用。但是当我在 tox 中执行 env 命令时,它会打印变量。

py37-django22 docker: run 'postgres:9'
py37-django22 run-test-pre: PYTHONHASHSEED='480168593'
py37-django22 run-test: commands[0] | env
PATH=
TOX_WORK_DIR=src/.tox
HTTPS_PROXY=http://0000:8000
LANG=C
HTTP_PROXY=http://0000:8000
PYTHONDONTWRITEBYTECODE=1
DJANGO_SETTINGS_MODULE=app.settings.base
PYTHONHASHSEED=480168593
TOX_ENV_NAME=py37-django22
TOX_ENV_DIR=/.tox/py37-django22
POSTGRES_USER=swordfish
POSTGRES_DB=swordfish
POSTGRES_PASSWORD=swordfish
POSTGRES_HOST=172.17.0.1
POSTGRES_5432_TCP_PORT=32822
POSTGRES_5432_TCP=32822
VIRTUAL_ENV=.tox/py37-django22
py37-django22 run-test: commands[1] | python -c 'print('"'"'qweqwe'"'"', '"'"'default_port'"'"')'
qweqwe default_port
py37-django22 run-test: commands[2] | pytest -sv --postgresql-port= --cov-report html --cov-report term --cov=app -l --tb=long --junitxml=junit/test-results.xml

【问题讨论】:

  • 欢迎使用 Groot221 :) 您可能希望在标签中添加“shell”以获得更多可见性。
  • 如果你有以下命令,结果会怎样? python -c "import os; print('qweqwe', os.environ['POSTGRES_5432_TCP_PORT'])"pytest -sv --postgresql-port=${POSTGRES_5432_TCP_PORT}
  • Hi @sinoroc '''python -c "import os; print('qweqwe', os.environ['POSTGRES_5432_TCP_PORT'])" ''' 提供正确的输出,但又是 '''pytest -sv --postgresql-port=${POSTGRES_5432_TCP_PORT}''' 失败。我刚刚以这种方式在 setenv 部分中分配了我的应用程序使用的变量 - '''APP_DB_PORT=$POSTGRES_5432_TCP_PORT ''' 我的应用程序直接获取端口号。我从命令中删除了 --postgresql-port 标志。
  • 我想它应该可以工作。也许使用passenv configuration option 会有所帮助。

标签: shell tox


【解决方案1】:

如果脚本设置了环境变量,则该环境变量仅对该进程可见。如果它导出变量,则该变量将是可见的,无论该脚本可能产生什么子外壳。一旦脚本退出,所有由 shell 进程和任何子进程设置的环境变量都将消失,因为它们只存在于该内存空间中。

不确定您要做什么,Docker 不是我的专长,但 5432 是常见的 Postgres 端口。如果你想将它提供给 pytest,你可以说

POSTGRES_5432_TCP_PORT=5432 pytest <test_name>

或者类似的东西。

【讨论】:

  • 嗨@ether_joe,感谢您的回答。我已经更新了帖子,也许它可能会有所帮助。
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多