问题描述
我写这篇文章是想询问以普通用户和特权(即 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-uic
和 sudo which pyside2-uic
的结果不匹配,后者没有给出二进制文件的路径。
于是我搜索了相关问题,找到了link。从答案来看,
sudo env "PATH=$PATH" python
保留普通用户的路径。