我有一个shell脚本来启动一些python脚本。我需要使用不同的用户启动python脚本,因此我通过sudo -u userX
来检查用户,但不知怎的,这句话混淆了PYTHONPATH
。
只启动一个python脚本,但是当我尝试从同一个目录导入脚本时,找不到它们。
shell脚本:
cd $1
sudo -u userX PYTHONPATH=. python3 $2
如您所见,我尝试手动将当前目录添加到PYTHONPATH
,但仍然出现相同的错误。
我的python脚本:
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(".")
之后起作用。但是为了我的目的,在python脚本中添加dir本身是没有选择的。所以我必须在启动python脚本之前添加它。
知道如何解决这个问题吗?
修改1:
我正在运行一个服务器,学生可以上传他们的python脚本。执行脚本然后进行评估。出于安全原因,我创建了一个“沙箱”(../sandbox/proc_0/..
),我将所有脚本复制到那里,然后用不同的用户userX
执行它们如何只有这个目录的读/写/执行者权限而在其他任何地方。我从后端调用的shell脚本(见上文)位于沙箱之外。
用户userX
是最小用户,没有home
目录或密码。
编辑2:
以下是我直接从shell执行脚本的示例,我将导演更改为../sandbox/proc_0/1/
。这个dir的样子如下:
|--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
时,它会在每种情况下都有效。