2014-05-21 87 views
0

是否有可能有一個上下文管理器,只是保持以前的run執行狀態。在代碼:結構上下文管理器與sudo

編輯:不工作的解決方案,這是我預料

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之前運行?

回答

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. 
+0

你是對的,第一個例子不會工作,但想要顯示我期待什麼類型的狀態執行。我會更新這個問題來反映這一點。我在運行前綴時設置shell_env的第二個問題是@zmo回答,這就是我所指的。 – Warz

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,你的代碼應該工作,你希望它的工作方式,但不是所有外殼解釋點運營商以相同的方式,使用source總是一個更好的主意。

with shell_env(ENV1="TEST"): 
    with prefix("source myapp"): 
      run("echo $ENV2") 

您可以考慮在myapp的錯誤,雖然,和/或仔細檢查所有的路徑和工作目錄設置是否正確。

+0

我仍然無法驗證生成的代碼。我可能會禁用輸出,但由'shell_env'設置的環境沒有在以下前綴中使用 – Warz