【问题标题】:Activating a VirtualEnv using a shell script doesn't seem to work使用 shell 脚本激活 VirtualEnv 似乎不起作用
【发布时间】:2011-11-14 05:04:07
【问题描述】:

我尝试通过如下所示的 shell 脚本激活 VirtualEnv,但它似乎不起作用,

#!/bin/sh
source ~/.virtualenvs/pinax-env/bin/activate

我收到以下错误

$ sh virtualenv_activate.sh 
virtualenv_activate.sh: 2: source: not found

但如果我在终端上输入相同的命令,它似乎可以工作

$ source ~/.virtualenvs/pinax-env/bin/activate
(pinax-env)gautam@Aspirebuntu:$

所以我把shell脚本改成了

#!/bin/bash
source ~/.virtualenvs/pinax-env/bin/activate

按照建议和使用

$ bash virtualenv_activate.sh 
gautam@Aspirebuntu:$

运行脚本。

这不会引发错误,但也不会激活虚拟环境

那么对于如何解决这个问题有什么建议吗?

PS:我使用的是 Ubuntu 11.04

【问题讨论】:

  • 试试bash virtualenv_activate.sh
  • 您能否详细说明并将其发布为答案。

标签: shell terminal virtualenv


【解决方案1】:

TLDR

必须使用 source 运行 .sh 脚本,而不是单独运行脚本

source your-script.sh

而不是 你的脚本.sh

详情

sh 与 bash 不同(虽然有些系统只是简单地将 sh 链接到 bash,所以运行 sh 实际上会运行 bash)。您可以将 sh 视为 bash 的淡化版本。 bash 具有而 sh 没有的一件事是“源”命令。这就是您收到该错误的原因...源代码在您的 bash shell 中运行良好。但是,当您使用 sh 启动脚本时,您会在子进程的 shell 中运行脚本。由于该脚本在 sh 中运行,因此找不到“源”。

解决方案是改为在 bash 中运行脚本。将第一行改为...

#!/bin/bash

然后运行...

./virtualenv_activate.sh

...或...

/bin/bash virtualenv_activate.sh

编辑:

如果您希望激活 virtualenv 来更改调用脚本的 shell,您需要使用“源”或“点运算符”。这样可以确保脚本在当前 shell 中运行(并因此更改当前环境)...

source virtualenv_activate.sh

...或...

. virtualenv_activate.sh

作为旁注,这就是为什么 virtualenv 总是说你需要使用“源”来运行它的激活脚本。

【讨论】:

  • 或使用与 source 等效的外壳,即. envFile,通常称为“dot the envFile”。祝你好运;-)
  • 谢谢,但这似乎并不能解决问题,当我使用 bash 时,它不会抛出错误,但也不会激活 virtualenv 。您能否详细说明 .envFile
  • 当您按照我展示的方式运行这些脚本时,它实际上会创建一个新的 shell,并在该 shell 中运行脚本。由于“源”脚本的全部目的是更改当前的 shell,这违背了目的。使用“source virtualenv_activate.sh”或“.virtualenv_activate.sh”运行您的脚本(注意第一个句点之后的空格)。
  • 在 Ubuntu 11.10 上,这是对我有用的小 .sh 脚本:. virtual-folder/bin/activatesudo service postgresql restartpython manage.py runserver
【解决方案2】:

source 是 bash 中的内置 shell 命令,在 sh 中不可用。如果我没记错的话,virtual env 做了很多路径和环境变量操作。即使以bash virtualenv_blah.sh 运行它也不会起作用,因为这只会在子shell 内创建环境。

尝试. virtualenv_activate.shsource virtualenv_activate.sh 这基本上可以让脚本在您当前的环境中运行,并且virtualenv 的activate 修改的所有环境变量都将可用。

HTH。

编辑:这是一个可能有帮助的链接 - http://ss64.com/bash/period.html

【讨论】:

    【解决方案3】:

    在 Mac OS X 上,您的建议似乎不起作用。

    我是这样做的。我对解决方案不太满意,但无论如何都在这里分享并希望,也许有人会建议更好的解决方案:

    activate.sh我有

    echo 'source /Users/andi/.virtualenvs/data_science/bin/activate'
    

    我通过以下方式授予执行权限:chmod +x activate.sh

    我是这样执行的:

    `./activate.sh`
    

    注意ASCII码96 = `(重音)形式的括号

    【讨论】:

      【解决方案4】:

      对我来说最好的工作方式如下。

      在代码下方创建 start-my-py-software.sh 和害虫

      #!/bin/bash
      source "/home/snippetbucket.com/source/AIML-Server-CloudPlatform/bin/activate"
      python --version
      python /home/snippetbucket.com/source/AIML-Server-CloudPlatform/main.py
      

      授予文件运行权限,如下所示。

      chmod +x start-my-py-software.sh
      

      现在运行如下

      .start-my-py-software.sh
      

      就是这样,启动我的基于 python 的服务器或任何其他代码。

      ubuntu #18.0

      【讨论】:

        【解决方案5】:

        在我的情况下,Ubuntu 16.04,上述方法效果不佳或需要大量工作。

        我刚刚创建了一个“激活”脚本文件的链接并将其复制到主文件夹(或 $PATH 可访问文件夹),并将其重命名为“actai”之类的简单文件。

        然后在终端中,调用“source actai”。成功了!

        【讨论】:

          猜你喜欢
          • 2018-06-25
          • 2011-10-20
          • 2017-02-17
          • 1970-01-01
          • 2016-11-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多