【问题标题】:Activating a python virtual environment within a bash script fails with "sudo: source: command not found"在 bash 脚本中激活 python 虚拟环境失败并显示“sudo: source: command not found”
【发布时间】:2019-07-18 07:52:38
【问题描述】:

我正在尝试使用 Bash 在 Ubuntu 18.04 上自动部署我的 Python-Flask 应用程序,方法是准备所有必要的文件/目录并从 Github 克隆源代码,然后创建虚拟环境,安装必备模块等。

现在因为我必须使用 sudo 执行我的 Bash 脚本,这意味着整个脚本将作为 root 执行,除非我另外指定使用 sudo -u myuser 并且在激活我的虚拟环境时,我得到以下输出:sudo: source: command not found 和我随后的 pip 安装都安装在虚拟环境之外。下面是我的代码摘录:

#!/bin/bash
...
sudo -u "$user" python3 -m venv .env
sudo -u $SUDO_USER source /srv/www/www.mydomain.com/.env/bin/activate
sudo -u "$user" pip install wheel
sudo -u "$user" pip install uwsgi
sudo -u "$user" pip install -r requirements.txt
...

现在对于我的生活,如果这有意义的话,我无法弄清楚如何在虚拟环境的上下文中激活虚拟环境。

我搜索了网络,发现的大多数问题/答案都围绕如何在 Bash 脚本中激活虚拟环境,而不是如何在执行为的 Bash 脚本中作为单独用户激活虚拟环境sudo.

【问题讨论】:

  • 你知道source是做什么的吗?
  • 无论如何,即使source 可以工作,当sudo 完成时,virtualenv 也会停用。整个脚本必须在一个 sudo 会话下运行。

标签: python bash sh virtualenv


【解决方案1】:

那是因为source 不是一个可执行文件,而是一个内置的bash 命令。它不适用于sudo,因为后者接受程序名称(即可执行文件)作为参数。

附:目前尚不清楚为什么必须以 root 身份执行整个脚本。如果您只需要以 root 身份执行一些命令(例如,用于启动/停止服务)并以普通用户身份运行剩余的大多数命令,则可以将 sudo 仅用于这些命令。例如。以下脚本

#!/bin/bash

# The `whoami` command outputs the current username. Unlike `source`, this is
# a full-fledged executable file, not a built-in command
whoami
sudo whoami
sudo -u postgres whoami

在我的机器上输出

trolley813
root
postgres

附言您可能不需要以root 的身份激活环境。

【讨论】:

  • 我以root 运行脚本的原因是因为我在脚本中运行的某些命令需要sudo,例如停止和启动服务,除非我对@ 感到困惑987654329@。我没有提到我也尝试过不使用source,这是我尝试过的行:Python sudo -u "$user" . /srv/www/www.domain.com/.env/bin/activate 据我了解,. 只是source 的别名。
  • @JeremyTan 如果您仅将sudo 用于所需的命令(以普通用户身份运行整个脚本),它们仍将以root 身份执行(或您指定为sudo 参数的任何用户) )。
  • @JeremyTan 我已经更新了答案,并添加了一个示例。
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多