Некоторые пользователи Google нашли этот вопрос на StackOverflow, где принятый ответ, предлагающий использовать os.execlpe для повторного запуска сценария, сохраняя ту же среду. Я попробовал, но при втором запуске сразу не удалось импортировать невстроенный модуль.
Расследование показало, что переменная 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
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'
Подробнее здесь: https://stackoverflow.com/questions/445 ... pt-as-root