find_executable() 中的不同结果:python 与 sudo python

问题描述

我写这篇文章是想询问以普通用户和特权(即 sudo)用户身份执行 python 之间有什么区别。

我有一个 python 脚本,它在特定目录中安装 python 包(这里使用了 /usr/local),为了做到这一点,脚本应该使用 sudo 运行。

脚本似乎在调用外部二进制文件,但是在 sudo 模式下它无法使用 find_executable(~) 找到它,而它在没有 sudo 命令的情况下完美地成功。

这里的代码:分别用 & 不用 sudo 调用脚本。两个代码具有(几乎但无影响)相同的内容

请注意,这两个 python 是相同的,因为我在 sudo 模式下明确调用它(我发现没有指定 python 二进制路径执行系统范围的 python)。

带 sudo:

sudo /home/.../anaconda3/envs/pytorch_open3d/bin/python
Python 3.8.8 (default,Feb 24 2021,21:46:12) 
[GCC 7.3.0] :: Anaconda,Inc. on linux
Type "help","copyright","credits" or "license" for more information.
>>> from distutils.spawn import find_executable
>>> pyside2Uic = ["pyside2-uic","python2-pyside2-uic","pyside2-uic-2.7"]
>>> found_pyside2Uic = any([find_executable(p) for p in pyside2Uic])
>>> print(found_pyside2Uic)
False

没有 sudo:

which python
/home/.../anaconda3/envs/pytorch_open3d/bin/python

python
Python 3.8.8 (default,"credits" or "license" for more information.
>>> from distutils.spawn import find_executable
>>> pyside2Uic = ["pyside2-uic"]
>>> found_pyside2Uic = any([find_executable(p) for p in pyside2Uic])
>>> print(found_pyside2Uic)
True

我也试过已经提供的答案 (link),这是一个保留当前环境信息的参数,但没有效果

sudo -E /home/.../anaconda3/envs/pytorch_open3d/bin/python
Python 3.8.8 (default,"credits" or "license" for more information.
>>> from distutils.spawn import find_executable
>>> pyside2Uic = ["pyside2-uic"]
>>> found_pyside2Uic = any([find_executable(p) for p in pyside2Uic])
>>> print(found_pyside2Uic)
False

有什么我错过的吗?非常感谢任何帮助。提前致谢。

ps。回声结果

echo $PATH
/home/.../anaconda3/envs/pytorch_open3d/bin:/home/.../anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
sudo echo $PATH
[sudo] password for ...: 
/home/.../anaconda3/envs/pytorch_open3d/bin:/home/.../anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

解决方法

感谢@Nephanth 的宝贵讨论,

我发现 which pyside2-uicsudo which pyside2-uic 的结果不匹配,后者没有给出二进制文件的路径。

于是我搜索了相关问题,找到了link。从答案来看,

sudo env "PATH=$PATH" python

保留普通用户的路径。