是否可以让上下文管理器保持先前run
执行的状态。在代码中:
with sudo('. myapp'): #this runs a few things and sets many env variables
run('echo $ENV1') # $ENV1 isn't set because the sudo command ran independently
我正在尝试运行几个命令,但希望在每个命令之间保持状态?
我尝试使用前缀上下文管理器,但它不能与shell_env上下文管理器一起使用:运行此代码时
with shell_env(ENV1="TEST"):
with prefix(". myapp"):
run("echo $ENV2")
我希望设置我的ENV
然后运行应该设置env2
的应用程序,但前缀在shell_env之前运行?
答案 0 :(得分:1)
不要理解这里提出的问题。你能否详细介绍一下你想要完成的事情。但是我尝试了同样的事情(with sudo('. myapp)
)你做了AttributeError __exit__
例外。
最后,我尝试使用前缀来获取bash文件并在此上下文中执行sudo命令行,这很好。
@fab.task
def trythis():
with fab.prefix('. testenv'):
fab.sudo('echo $ENV1')
执行任务时,我得到以下输出。
[host] Executing task 'trythis'
[host] sudo: echo $ENV1
[host] out: sudo password:
[host] out: testing
[host] out:
Done.
Disconnecting from host... done.
答案 1 :(得分:0)
with shell_env(ENV1="TEST"):
with prefix(". myapp"):
run("echo $ENV2")
我预计我的ENV会被设置然后运行我的应用程序应该设置env2但是前缀在shell_env之前运行?
给定fabric's documentation您编写的代码将生成:
export ENV1="TEST" && . myapp && echo $ENV2
鉴于myapp
创建ENV2
,您的代码应该按照您希望的方式工作,但并非所有shell都以相同的方式解释点运算符,使用source
始终是更好的主意。
with shell_env(ENV1="TEST"):
with prefix("source myapp"):
run("echo $ENV2")
您可以考虑myapp
中的错误,和/或仔细检查是否正确设置了所有路径和工作目录。