使用时缺少PYTHONPATH变量操作系统执行重新启动脚本为

2024-04-26 21:08:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我的最终目标是拥有一个脚本,该脚本最初可以由非特权用户在不使用sudo的情况下启动,但会提示输入sudo密码并自我提升到root。我一直在用bash包装器脚本来完成这项工作,但是我想要一些更整洁的东西,不需要额外的文件。你知道吗

一些谷歌搜索发现this question on StackOverflow接受的答案建议使用操作系统执行在保留相同环境的情况下重新启动脚本。我尝试过,但在第二次运行时,它立即无法导入非内置模块。你知道吗

调查发现PYTHONPATH变量没有被继承,而几乎所有其他的环境变量都被继承了(PERL5LIB也丢失了,还有一些其他的,但是我没有使用它们,所以它们不会困扰我)。你知道吗

我有一个简短的测试脚本来演示这个问题:

#!/usr/bin/env python
import os
import sys

print(len(os.environ['PYTHONPATH']))

euid = os.geteuid()
if euid != 0:
    print("Script not started as root. Running with sudo.")
    args = ['sudo', sys,executable] + sys.argv + [os.environ]
    os.execlpe('sudo', *args)

print("Success")

预期产出为:

6548
Script not started as root. Running with sudo.
[sudo] password for esker:
6548
Success

但是我得到了一个关键错误:

6548
Script not started as root. Running with sudo.
[sudo] password for esker:
Traceback (most recent call last):
  File "/usr/home/esker/execlpe_test.py", line 5, in <module>
    print(len(os.environ['PYTHONPATH']))
  File "/vol/apps/python/2.7.6/lib/python2.7/UserDict.py", line 23, in __getitem__
    raise KeyError(key)
KeyError: 'PYTHONPATH'

这个变量丢失的原因是什么?如何避免它消失?或者,有没有更好的方法来避免遇到问题?你知道吗


Tags: 脚本osaswithsysenvironsudoscript
1条回答
网友
1楼 · 发布于 2024-04-26 21:08:38

您将环境作为参数传递给脚本,而不是作为参数传递给execlpe。请尝试以下操作:

args = ['sudo', sys,executable] + sys.argv + [os.environ]
os.execvpe('sudo', args, os.environ)

如果你只是想继承环境,你甚至可以

os.execvp('sudo', args)

相关问题 更多 >