首页 > 解决方案 > find_executable() 的不同结果:python vs sudo python

问题描述

我写这篇文章是为了问以普通用户和优先(即 sudo)用户身份执行 python 之间有什么区别。

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

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

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

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

带须藤:

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

我还尝试了已经提供的答案(链接),这是一个保留当前环境信息的参数,但没有效果:

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

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

附言。回声的结果

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

标签: pythoncondasudo

解决方案


感谢@Nephanth 的宝贵讨论,

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

所以我搜索了相关问题,并找到了链接。从答案来看,

sudo env "PATH=$PATH" python

普通用户的保留路径。


推荐阅读