3

我有一个关于 python 和 linux 中的环境变量的问题。我在这里阅读了很多问题/答案,但没有一个完全符合我的情况。它是这样的:

我在 python 中有一个脚本,可以自动安装 virtualenvwrapper 和其他一些东西。它在使用模块 sysem 的 HPC 集群上运行。安装的步骤之一是修改一些配置文件(~/.bashrc 和 ~/.virtualenvs/postactivate),以便新的环境变量和命令可用。

具体来说,我修改了 .bashrc,在 ~/opt/mypython/bin/virtualenvwrapper.sh 中添加了一个源,它定义了很多有用的命令来管理 virtualenv。在同一个脚本中,我想创建一个虚拟环境,所以,直到现在,我正在做:

install_and_create_virtualenv ='''
    easy_install --prefix=~/opt/mypython pip &&
    pip install virtualenvwrapper --install-option="--prefix=~/opt/mypython" &&
    . ~/.bashrc &&
    module unload python &&
    mkvirtualenv --python=/sw/comp/python/2.7_kalkyl/bin/python master
    '''

check_call(install_and_create_virtualenv, shell=True, env=env)

如您所见,我做了一个 . ~/.bashrc 在 check_call 中。这来源于 .bashrc(因此也是 virtualenvwrapper.sh),然后我可以调用 mkvirtualenv。否则 mkvirtualenv 将不可用,因为我刚刚安装了它。

如果我只做一次,这将不是问题。但事实是我做了几次 check_call 并且在每一个中我都必须获取 .bashrc 因为否则我会在“干净”的环境中执行 check_call 并且我无法继续。

所以我的问题是:有什么方法可以像我离开脚本、获取 .bashrc 并再次输入脚本一样更新一般环境?

非常感谢!

注意:传递给 check_call 的 env 参数只有几个通用变量,我不能将 virtualenvwrapper 定义的每个命令都添加到这个 env 中。

4

1 回答 1

0

正如您所指出的,这些命令通常只是操纵环境。我将env在此设置过程中作为最终命令运行,并将其参数解析为 dict。这个 dict 可以添加到env你已经拥有的变量中,或者如果你想让它成为永久的和全局的,你可以os.environ.update(virtualenv_env).

于 2012-09-19T15:57:19.437 回答