python - 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
解决方案
感谢@Nephanth 的宝贵讨论,
我发现which pyside2-uic
and的结果不匹配sudo which pyside2-uic
,后者没有给出二进制文件的路径。
所以我搜索了相关问题,并找到了链接。从答案来看,
sudo env "PATH=$PATH" python
普通用户的保留路径。
推荐阅读
- abap - 从 itab 中获取其他字段中每个不同值的最高值
- android - Android模拟器上的白屏,但屏幕截图显示它可以正常工作
- python - 用于过滤 Pandas DataFrame 行的 excel 嵌套 if 条件的 Python 等效项
- python - Python方法之间的区别是否可以创建新变量
- javascript - 使用 API 删除有时有效,有时无效
- url - QnA Maker 管理知识 - 添加新 URL 的问题
- random - 如何在 Jenkinsfile 中为 Selenium 端口分配随机 4 位数字
- html - 模板的表单参数中的值未在视图中传递
- python - 散列字符串列表元素并保存到新列表
- ios - Xamarin 捆绑包引用了 .net 标准项目内容