【发布时间】:2021-07-25 15:07:58
【问题描述】:
我写这篇文章是想问以普通用户和优先(即 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, 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"]
>>> 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, 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"]
>>> 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
【问题讨论】:
-
可能你的 root 用户和你的用户没有相同的 $PATH ?
-
@Nephanth 添加了 echo 的结果,但两者似乎相同......奇怪。
-
但是
find_executable("pyside2-uic")作为用户返回true,作为root返回false?您是否尝试过使用 which(作为用户和 root)? -
@Nephanth 是的,我试过了。 'which' 给出了不同的 python 路径(普通用户中的 conda 的 python,sudo 中的系统范围的 python),但我认为这可以忽略不计,因为我指定 python 二进制文件在 sudo 模式下使用 conda 的。
-
不,我的意思是
which pyside2-uic