gpt4 book ai didi

python - 在同一个 Fabric 执行中使用 2 次 cd() 调用

转载 作者:太空宇宙 更新时间:2023-11-03 18:48:34 25 4
gpt4 key购买 nike

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

基本上,我想嵌套一个 cd() 调用、一个 prefix() 调用(将从当前路径加载一些内容)和另一个 cd() 调用finally 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'),后者将从上下文中完全覆盖。

我能看到的唯一解决方案是将前 3 行连接到一个唯一的 prefix() 内,并用 && 分隔,但对我来说这确实显得很黑客:

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

是否有另一种/更优雅的方式来做到这一点?我所说的“更优雅”是指使用 Fabric 方法而不是我的 hack 的解决方案。

当然,对于这个特定的示例,我可以使用 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 得到了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com