我最近asked for explanations关于我不了解的Fabric脚本行为。现在,我了解了Fabric的工作原理,我仍在努力寻找解决问题的方法:-)

基本上,我想嵌套一个cd()调用,一个prefix()调用(将从当前路径加载一些内容)和另一个cd()调用以最终run()一个注释。

我想到的最好的例子是:

with cd('/my/virtualenv/dir/'):
  with prefix('source bin/activate'):
    with cd('/my/project/dir/'):
      run('pip install -r requirements.txt')
      run('./run_something')


这是行不通的,因为cd('/my/project/dir')将优先于cd('/my/virtualenv/dir'),这将被上下文完全覆盖。

我能看到的唯一解决方案是将唯一的prefix()内的前三行连接在一起,并用&&隔开,但对我来说确实有点黑:

with prefix('cd /my/virtualenv/dir/ && source bin/activate && cd /my/project/dir/'):
  run('pip install -r requirements.txt')
  run('./run_something')


还有另一种/更优雅的方法吗? “更优雅”是指一种将使用Fabric方法而不是我的技巧的解决方案。

当然,对于此特定示例,我可以使用virtualenvwrapper,但随后它变得过于具体,不适用于不基于virtualenv的其他类似情况。

最佳答案

我已经在自己的机器上进行以下操作:

with cd("~/somedir"), prefix("source ~/.virtualenvs/venv/bin/activate"):
    with cd("anotherdir"):
        run("ls")


我真正的问题是,一旦激活了virtualenv,为什么需要cd进入另一个目录?如果您只想使用pip安装某些东西,这应该可以正常工作

with cd('/my/virtualenv/dir/'), prefix('source bin/activate'):
   run('pip install something')


我从fabric docs btw得到了with cd("dir"), prefix("stuff")的主意

编辑:

作为我答案的更新:为什么不只使用两个绝对路径?

with cd("/abs/path/to/my/file"), prefix("source /abs/path/to/my/venv/bin/activate"):
    run("pip install something")
    run("./somefile.py")


Fabric将执行与您尝试输入的命令类似的命令:

Executed: /bin/bash -l -c "cd /abs/path/to/my/file && source ~/abs/path/to/my/venv/bin/activate && pip install something"


然后它将运行

./somefile.py

关于python - 在同一Fabric执行中使用2个cd()调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18908150/

10-15 14:51