2016-02-05 4 views
2

Возвращает ошибку «OSError: no Такой файл или каталог». Мы пытались активировать наш недавно созданный виртуальный env venvCI, используя шаги в построителе с shellCommand.Seems, как мы не можем активировать virtualvv venvCI. Были только новыми в этой среде, поэтому, пожалуйста, помогите нам. Спасибо.(Buildbot) Невозможно активировать virtualenv с помощью ShellCommand

from buildbot.steps.shell import ShellCommand 

factory = util.BuildFactory() 

# STEPS for example-slave: 

factory.addStep(ShellCommand(command=['virtualenv', 'venvCI'])) 

factory.addStep(ShellCommand(command=['source', 'venvCI/bin/activate'])) 

factory.addStep(ShellCommand(command=['pip', 'install', '-r','development.pip'])) 

factory.addStep(ShellCommand(command=['pyflakes', 'calculator.py'])) 

factory.addStep(ShellCommand(command=['python', 'test.py'])) 

c['builders'] = [] 
c['builders'].append(
    util.BuilderConfig(name="runtests", 
     slavenames=["example-slave"], 
     factory=factory)) 
+0

@varesa Я попробую это и сообщит вам о результатах. Благодаря! –

+0

@varesa Эй! Спасибо. Это сработало. –

ответ

2

Поскольку buildsystem создает новую оболочку для каждого ShellCommand вы не можете source env/bin/activate так, что только изменяет среду активного командного интерпретатора. Когда Shell (Command) завершает работу, среда исчезла.

Вещи, которые вы можете сделать:

  • Дайте среду вручную для каждого ShellCommand (читай, что activate делает) env={...}

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

e .г.

myscript.sh:

#!/bin/bash 

source env/bin/activate 
pip install x 
python y.py 

Buildbot:

factory.addStep(ShellCommand(command=['bash', 'myscript.sh'])) 

blog post about the issue

2

Другой вариант заключается в вызове питона исполняемый внутри виртуальной среды непосредственно, так как многие инструменты Python, которые обеспечивают команду частотные команды часто исполняются как модули:

from buildbot.steps.shell import ShellCommand 

factory = util.BuildFactory() 

# STEPS for example-slave: 

factory.addStep(ShellCommand(command=['virtualenv', 'venvCI'])) 

factory.addStep(ShellCommand(
    command=['./venvCI/bin/python', '-m', 'pip', 'install', '-r', 'development.pip'])) 

factory.addStep(ShellCommand(
    command=['./venvCI/bin/python', '-m', 'pyflakes', 'calculator.py'])) 

factory.addStep(ShellCommand(command=['python', 'test.py'])) 

Однако, это утомительно через некоторое время. Вы можете использовать string.Template сделать помощникам:

import shlex 
from string import Template 

def addstep(cmdline, **kwargs): 
    tmpl = Template(cmdline) 
    factory.addStep(ShellCommand(
     command=shlex.split(tmpl.safe_substitute(**kwargs)) 
    )) 

Затем вы можете сделать что-то вроде этого:

addstep('$python -m pip install pytest', python='./venvCI/bin/python') 

Вот некоторые идеи, чтобы начать работу. Обратите внимание, что аккуратная вещь о shlex заключается в том, что она будет учитывать пробелы внутри строк с кавычками при выполнении разделения.

Смежные вопросы