這裏有一個稍微更完整的答案,構建由多納爾和betapatch的答案,它允許你兩個模塊裏面做類似的事情之間進行切換:
if { [module-info mode load] || [module-info mode switch2] } {
puts stdout "source /programs/program-env/bin/activate;"
} elseif { [module-info mode remove] && ![module-info mode switch3] } {
puts stdout "deactivate;"
}
首先,你需要使用source .../activate
而不是隻是.../activate
。
其次,modules
有一些可怕的邏輯,當swap
ping模塊。如果你想module swap foo bar
(刪除foo
並在其位置加載bar
),它實際上執行以下操作:
foo: switch1 # prep for remove
foo: remove # actually remove
bar: switch2 # load new module
foo: switch3 # cleanup
foo: remove # happens at the same time as foo switch3
這意味着,如果foo
和bar
使用virtualenvs,第二foo remove
將deactivate
bar
都modulefiles。
非常感謝您的回覆。對不起,我沒有很好地解釋這個問題。我現在更新了我的問題以包含更多信息。如果你能幫忙,請看看它。另外,我不知道如何在模塊文件中測試上述腳本。再次感謝您的努力,我非常感謝! – arnstrm
如果您使用本示例中的所有過程(除了新模塊文件中的主過程),請安排您的模塊代碼以調用load_virtualenv,然後它應該配置所需的環境。您可能需要更改update_env proc來調用setenv,而不是更新env數組,但顯然這應該按原樣運行。 – patthoyts