1

我想编写一个小脚本来获取我的 virtualenv(用于 Python 项目)目录。当我在我的项目目录中的某个地方时,我知道我的虚拟环境的“venv”目录位于我当前目录的祖先之一的目录中。

我想编写一个 shell 脚本,venv/bin/activate它的来源和效果应该在这个 shell 脚本之外持续存在。这不是现在发生的。

这是我的代码:

#!/bin/bash

#set -x

while [ $PWD != "/" ]; do
    #echo $PWD
    if [ -d "venv" ]; then
        echo "venv found in $PWD. Sourcing."
        source venv/bin/activate
        break
    else
        cd ..
    fi
done

为什么它现在不起作用,我该如何解决?

编辑:

如果有帮助,venv/bin/activate 的内容在这里:http ://pastebin.com/TZ40brsq 由virtualenv工具生成(一般用于 Python 项目)。

4

2 回答 2

2

您不能通过使用在子进程中运行的 shell 脚本来影响当前环境。

如果pushd "$(pwd)"在 while 循环之前和popd之后添加,则可以通过获取脚本文件而不是执行它来获得所需的内容

于 2012-12-03T11:32:38.110 回答
2

您将不得不使用调用脚本

source path/to/script

或者

. path/to/script

(同样的事情)而不是运行它。这是一种安全措施,当您运行程序时,它不能更改其父进程(即您的 shell 会话)的环境。但是,当您使用 时source,您是在告诉 shell 读取文件的内容并运行它,就好像您自己键入了该内容一样。

如果您已经以这种方式采购脚本,那么我不确定发生了什么。

于 2012-12-03T07:39:33.473 回答