【发布时间】:2015-03-11 03:03:30
【问题描述】:
我有一个脚本存储在 /etc/init.d 中,在启动时执行时可以正常工作。由于我不导出 USER,它应该以 root 身份执行所有操作(如果我没记错的话)。
然后,它执行 python3 script.py 在这个脚本中,一切正常,直到它到达
espeak_process = Popen(["espeak", "-ves", "-s100", msg, "--stdout"], stdout=subprocess.PIPE)
aplay_process = Popen(["aplay", "-D", "sysdefault"], stdin=espeak_process.stdout, stdout=subprocess.PIPE)
编辑:此代码已更改,但创建的文件为空
def log_uncaught_exceptions(ex_cls, ex, tb):
f = open('/home/pi/debug_err.txt', 'w')
f.write('hi ')
f.write(ex_cls+' '+ex+' '+tb)
f.close()
sys.excepthook = log_uncaught_exceptions
espeak_process = Popen(["espeak", "-ves", "-s100", msg, "--stdout"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
/编辑
它在什么时候停止。我可以说,因为它在这一步之前和之后写了一个调试文件,而第二个从来没有写过。
问题是,如果我在终端中执行
sudo sh /etc/init.d/begin start
那么“python3 script.py”就完全没问题了,包括Popen部分。
为什么会这样? 谢谢
(init.d 脚本)
#! /bin/sh
# /etc/init.d/begin
#USER=pi
HOME=/home/pi
#export USER HOME
export HOME
case "$1" in
start)
if [ -f "/home/pi/begin.pid" ];
then
kill -9 $(cat /home/pi/begin.pid)
rm -f /home/pi/begin.pid
fi
python3 /home/pi/script.py &
;;
stop)
kill -9 $(cat /home/pi/begin.pid)
rm -f /home/pi/begin.pid
;;
*)
echo "Usage: /etc/init.d/begin {start|stop}"
exit 1
;;
esac
exit 0
【问题讨论】:
-
您可以尝试阅读
stderr并记录输出吗? -
谢谢。根据您的链接,我尝试使用communicate() 恢复错误消息,但是python脚本在执行时停止,因此它永远不会到达此代码。有没有办法解决这个问题?
-
[python脚本在执行“communicate()”命令之前退出,所以我看不到任何错误信息]
-
不相关的:你应该添加
close_fds=True(它在POSIX上是默认的,因为一些Python 3版本)并将所有(stdin/stdout/stderr)未使用的流设置为DEVNULL,例如stdin=DEVNULL。在Popen(["aplay...之后调用espeak_process.stdout.close()从aplay_process.stdout读取或设置stdout=DEVNULL。
标签: python raspberry-pi popen init.d