使用sudo的结构上下文管理器

时间:2014-05-21 14:33:05

标签: python fabric contextmanager

是否可以让上下文管理器保持先前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之前运行?

2 个答案:

答案 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中的错误,和/或仔细检查是否正确设置了所有路径和工作目录。