我正在尝试为一个创建python virtualenv
的程序编写一个模块文件。为了启动virtualenv
,它需要首先运行/programs/program-env/bin/activate
。我如何在modulefile
中做到这一点?任何帮助都将不胜感激。
注意:我试着将上面的代码行放入文件中,但它不起作用。
谢谢,
编辑:
我正在编写一个modulefile来加载一个只能在virtualenv
中运行的程序。通常,这些模块文件将设置变量名和/或将bin目录添加到path。由于上面的包有些不同,我不知道如何继续。可以在here中找到一个示例模块文件。
发布于 2016-02-25 15:22:21
这是一个稍微完整的答案,基于Donal和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
。
其次,当swap
ping模块时,modules
有一些可怕的逻辑。如果你想要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
都是使用virtualenv的模块文件,那么第二个foo remove
将deactivate
bar
。
发布于 2014-04-06 07:59:33
Modules系统非常奇怪,因为它真正做的是创建一组指令,这些指令由调用shell进行计算。这意味着通常的Tcl处理方式通常并不完全正确;需要运行/programs/program-env/bin/activate
的是调用者,而不是Tcl脚本。
首先要尝试的是:
system "/programs/program-env/bin/activate"
但是,从the FAQ的字里行间可以看出,您可能需要这样做(使用卫士):
if {[module-info mode] == "load"} {
puts stdout "/programs/program-env/bin/activate"
}
我不知道如何反转操作(这是模块点的一部分)。
发布于 2015-09-02 11:43:58
基于Donal Fellows和文档:
if { [ module-info mode load ] } {
puts stdout "/programs/program-env/bin/activate;"
} elseif { [ module-info mode remove ] } {
puts stdout "deactivate;"
}
分号是必要的。
https://stackoverflow.com/questions/22885134
复制相似问题