我遇到一个问题,我的程序在以root身份运行时没有找到环境变量。我目前有程序做:
#!/usr/bin/python3
from i2clibraries import i2c_adxl345
#various other imports
euid=os.geteuid()
if euid != 0:
args=['sudo',sys.executable]+sys.argv+[os.environ]
os.execlpe('sudo',*args)
#rest of program
除环境变量外,必要的文件位于此程序所在的目录/ home / pi / project-test
如果该程序以root用户身份重新启动,如何设置该程序可以访问的环境变量?他们是:
export QUICK2WIRE_API_HOME=~/project-test/quick2wire-python-api
export PYTHONPATH=$PYTHONPATH:$QUICK2WIRE_API_HOME
在我的程序目录中执行这些导出时,以用户(pi)运行而不是root用户运行时修复它。我可以修复上面的QUICK2WIRE_API_HOME位置,还是需要将我的所有库和程序加载到另一个位置?
注意:替换'sudo -E'或'sudo -E su'in并不包含我预期设置的环境变量。顺便说一句,收到的实际错误是:
ImportError: No module named quick2wire.i2c
这是环境变量设置路径的内容。此外,它必须以root身份运行,因为某些程序访问GPIO并在用户(pi)返回时运行:
RuntimeError: No access to /dev/mem
我也玩弄过使用多处理或线程分解它的想法,但目前两者都远远超过我的头脑,以了解我需要包含什么以及在哪里设置函数,args等。
可以找到完整的程序here.
更新:我通过Thinkbowl将所有相关文件重新载入/ root。仍然不想接受位于/ root中的quick2wire库。目前/ root看起来像:
. .config .gvfs quick2wire-python-api
.. .dbus i2clibraries .Xauthority
.bash_history .Desktop .idlerc .xsession-errors
.bashrc .gpio.sh .local
.cache .gstreamer-0.10 .profile
i2c *和.quick *是从thinkbowl下载的两个库。当我表演时:
env | grep quick2wire
in / root我得到:
OLDPWD=/root/quick2wire-python-api
QUICK2WIRE_API_HOME=/root/quick2wire-python-api
PYTHON=$PYTHONPATH:$QUICK2WIRE_API_HOME:/root/quick2wire-python-api