Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash脚本中激活python虚拟环境失败;sudo:source:command not found";_Python_Bash_Sh_Virtualenv - Fatal编程技术网

在bash脚本中激活python虚拟环境失败;sudo:source:command not found";

在bash脚本中激活python虚拟环境失败;sudo:source:command not found";,python,bash,sh,virtualenv,Python,Bash,Sh,Virtualenv,我正在尝试使用Bash在ubuntu18.04上自动部署我的Python Flask应用程序,方法是准备所有必要的文件/目录,从Github克隆源代码,然后创建虚拟环境,安装必要的模块等等 现在,因为我必须使用sudo执行Bash脚本,这意味着整个脚本将作为root执行,除非我使用sudo-u myuser另外指定,并且在激活虚拟环境时,我得到以下输出:sudo:source:command not found和我随后的pip安装都安装在虚拟环境之外。我的代码摘录如下: #/bin/bash .

我正在尝试使用Bash在ubuntu18.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安装控制盘
sudo-u“$user”pip安装uwsgi
sudo-u“$user”pip安装-r requirements.txt
...
现在就我的生活而言,我不知道如何在虚拟环境的上下文中激活虚拟环境,如果这有任何意义的话


我在网上搜索了一下,发现的大多数问题/答案都围绕着如何在Bash脚本中激活虚拟环境,而不是如何在作为
sudo
执行的Bash脚本中作为单独的用户激活虚拟环境,这是因为
source
不是可执行文件,而是一个内置的
bash
命令。它不适用于
sudo
,因为后者接受程序名(即可执行文件)作为参数

另外,不清楚为什么必须以root用户身份执行整个脚本。如果您只需要以root用户身份执行多个命令(例如用于启动/停止服务)并以普通用户身份运行剩余的大多数命令,则只能对这些命令使用sudo。例如,下面的脚本

#/bin/bash
#“whoami”命令输出当前用户名。与“source”不同,这是
#完整的可执行文件,而不是内置命令
哇
sudowhoami
sudo-u postgres whoami
在我的机器输出上

trolley813
root
postgres

p.p.S.您可能不需要将环境激活为
root

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

另外,不清楚为什么必须以root用户身份执行整个脚本。如果您只需要以root用户身份执行多个命令(例如用于启动/停止服务)并以普通用户身份运行剩余的大多数命令,则只能对这些命令使用sudo。例如,下面的脚本

#/bin/bash
#“whoami”命令输出当前用户名。与“source”不同,这是
#完整的可执行文件,而不是内置命令
哇
sudowhoami
sudo-u postgres whoami
在我的机器输出上

trolley813
root
postgres

p.p.S.您可能不需要以
root

的身份激活环境,您知道
source
的功能吗?无论如何,即使
source
可以工作,virtualenv也会在
sudo
完成时停用。整个脚本必须在一个
sudo
会话下运行。你知道
source
做什么吗?无论如何,即使
source
可以工作,virtualenv也会在
sudo
完成时停用。整个脚本必须在一个
sudo
会话下运行。我以
root
身份运行脚本的原因是,我在脚本中运行的某些命令需要
sudo
停止和启动服务,除非我对
sudo
感到困惑。我没有提到我也尝试过不使用
source
,下面是我尝试过的一行:
pythonsudo-u“$user”/srv/www/www.domain.com/.env/bin/activate
据我所知,
只是
source
@JeremyTan的别名。如果您仅将
sudo
用于所需的命令(以普通用户身份运行整个脚本),它们仍将作为root用户(或指定为
sudo
参数的任何用户)执行@JeremyTan我已经更新了答案,并添加了一个示例。我之所以以
root
的身份运行脚本,是因为我在脚本中运行的一些命令需要
sudo
类似于停止和启动服务,除非我对
sudo
感到困惑。我没有提到我也尝试过不使用
source
,下面是我尝试过的一行:
pythonsudo-u“$user”/srv/www/www.domain.com/.env/bin/activate
据我所知,
只是
source
@JeremyTan的别名。如果您仅将
sudo
用于所需的命令(以普通用户身份运行整个脚本),它们仍将作为root用户(或指定为
sudo
参数的任何用户)执行@JeremyTan我已经更新了答案,添加了一个例子。