У меня есть сценарий оболочки для запуска некоторых сценариев Python. Мне нужно запустить скрипт python с другим пользователем, поэтому я проверяю пользователя с помощью sudo -u userX
, но каким-то образом это утверждение портит PYTHONPATH
.
Запуск только одного скрипта Python работает, но когда я пытаюсь импортировать скрипты из того же каталога, они не найдены.
Сценарий оболочки:
cd $1
sudo -u userX PYTHONPATH=. python3 $2
Как видите, я попытался добавить текущий каталог вручную к PYTHONPATH
, но все равно ошибка.
Мой скрипт на питоне:
import sys
print(sys.path)
from second import calc
#output of the script:
# $ ['', '/var/www/html/assignments_rest/EvaluationServer/sandbox/proc_0/1', ...]
# $ Traceback (most recent call last): File "first.py", line 4, in <module> from second import calc
# $ ImportError: No module named 'second'
Когда я добавляю путь в скрипт Python, он работает нормально:
sys.path.append(".")
print(sys.path)
from second import calc
# $ ['', '/var/www/html/assignments_rest/EvaluationServer/sandbox/proc_0/1', ...]
# $ doing stuff no erros
Что меня действительно смущает, так это то, что швы sys.path
такие же, но импорт работает только после sys.path.append(".")
. Но для моей цели добавить dir в сам скрипт python не вариант. Поэтому я должен добавить это перед запуском самого скрипта python.
Есть идеи, как это решить?
Редактировать 1:
Я работаю на сервере, где студенты могут загружать свои скрипты Python. Сценарии выполняются, а затем оцениваются. По соображениям безопасности я создал «песочницу» (../sandbox/proc_0/..
), я скопировал все сценарии туда, а затем выполнил их с другим пользователем userX
, который имеет права только на чтение / запись / выполнение для этого каталога и больше нигде. Сценарии оболочки, которые я вызываю из моего бэкэнда (см. Выше), расположены вне песочницы.
Пользователь userX
является минимальным пользователем без home
каталога или пароля.
Редактировать 2:
Вот пример, когда я выполняю сценарии непосредственно из оболочки, я изменил директорию на ../sandbox/proc_0/1/
. Вот как выглядит каталог:
|--first.py
|--second.py
Отлично работает следующее:
$ mb@assignments:../sandbox/proc_0/1$ python3 first.py
$ Geben Sie eine Zßhl ein: 3
$ Das Ergebniss ist 2.3 für a = 3
Запуск такой же, но с изменением пользователя:
$ mb@assignments:../sandbox/proc_0/1$ sudo -u eval python3 first.py
$ Traceback (most recent call last):
$ File "first.py", line 1, in <module>
$ from second import calc
$ ImportError: No module named 'second'
Добавление PYTHONPATH
:
$ mb@assignments:../sandbox/proc_0/1$ sudo -u eval PYTHONPATH=/var/www/html/assignments_rest/EvaluationServer/sandbox/proc_0/1 python3 first.py
$ Traceback (most recent call last):
$ File "first.py", line 1, in <module>
$ from second import calc
$ ImportError: No module named 'second'
Когда я добавляю буксирные линии sys.path.append("."); print(sys.path)
к first.py
, это работает в каждом случае.