我试图在 bash 脚本中调用 python,但脚本找不到它。我已经 30 多年没有做过 bash 脚本编程了,所以我目前不擅长 bash 脚本调试。我正在使用 pyenv 选择要在特定目录中使用的 python 版本。这是我正在使用的设置:
dnessett@homelserv:~/SaltSource/scripts$ ls
python_on_root.sh
dnessett@homelserv:~/SaltSource/scripts$ cat python_on_root.sh
#!/bin/bash
sudo python "$@"
dnessett@homelserv:~/SaltSource/scripts$ pyenv local 3.10.15
dnessett@homelserv:~/SaltSource/scripts$ python --version
Python 3.10.15
dnessett@homelserv:~/SaltSource/scripts$ ./python_on_root.sh
sudo: python: command not found
由于我在脚本中使用 sudo 来调用 python,因此 /etc/sudoers 中的条目希望允许 sudo 执行本地 python 解释器:
#add python to sudo list
dnessett homelserv=(root)NOPASSWD:/home/dnessett/.pyenv/versions/3.10.15/bin/python
dnessett 是用户名,homelserv 是机器名。NOPASSWD 后面的路径名是 python 版本 3.10.15 所在的位置。
这一切的重点是使用 python_on_root.sh 脚本作为 Eclipse/PyDev 项目的解释器(参见:Stack Overflow 线程)。
从上面的输出可以明显看出,sudo 找不到 python,即使我已将其设置为 ~/SaltSource/scripts 中的本地 python 解释器。我猜想脚本和 sudo 之间存在某种交互,导致后者无法找到所需的 python 解释器。
有人能看到这个问题并告诉我如何解决吗?
sudo
PATH
继承与您自己的不同,并且可能不包括安装 python 的位置。您可以通过脚本中的完整路径调用它,即:但是,以 root 身份运行 python 可能会出现一些其他不必要的问题,例如您的
HOME
和PYTHONPATH
环境变量不同,因此您可能需要运行sudo -E
,但无论如何您仍然应该指向 python 的完整路径。最后,您可能根本不应该以 root 身份运行 python。无论您尝试做什么,都有可能以不同的、更正确的方式解决,例如更改文件/目录权限以允许您的用户完成所需的任务。
根据上一个答案,我需要做的改变是:
将 python 添加到 sudo 列表
SETENV:
后面的额外内容NOPASWD:
覆盖了禁止保护环境的规定。我在这里找到了这个:Stack Exchange 超级用户帖子然后按照jesse_b在前面的回答中说的,将脚本修改为: