(Buildbot)无法使用ShellCommand激活virtualenv

时间:2016-02-05 11:32:22

标签: python ubuntu virtualenv buildbot

返回错误“OSError:no此类文件或目录”。我们尝试使用带有shellCommand的构建器中的步骤激活我们新创建的虚拟env venvCI。我们不能激活virtualenv venvCI。在这种环境中只是新的,所以请帮助我们。谢谢。

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))

2 个答案:

答案 0 :(得分:2)

由于构建系统为每个ShellCommand创建一个新Shell,因此只能修改活动shell的环境。source env/bin/activate当Shell(Command)退出时,环境就消失了。

你可以做的事情:

  • 为每个ShellCommand手动提供环境(阅读内容 activate确实)env={...}

  • 创建一个运行所有命令的bash脚本 一个shell(我在其他系统中所做的)

e.g。

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

答案 1 :(得分:2)

另一种选择是直接在虚拟环境中调用python可执行文件,因为许多提供命令行命令的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的简洁之处在于它在进行拆分时会尊重引用字符串中的空格。