我想在这里参考我之前的帖子:每当 python 脚本崩溃时自动启动raspberry pi
在我的(Stretch OS)上重新启动两个 python 脚本(如果它们崩溃)。
调用的shell脚本代码constantrun.sh
如下:
#!/bin/sh
PYTHONPATH=/home/pi/.local/lib/python2.7/site-packages
COMMAND1=python /home/pi/project/script1.py
COMMAND2=python /home/pi/project/script2.py
rm -f COMMAND1_failed; ("${COMMAND1[@]}"; touch COMMAND1_failed)&
rm -f COMMAND2_failed; ("${COMMAND2[@]}"; touch COMMAND2_failed)&
while true
do
if [ -e COMMAND1_failed ]
then
# Restart Command1
rm -f COMMAND1_failed; ("${COMMAND1[@]}"; touch COMMAND1_failed)&
fi
if [ -e COMMAND2_failed ]
then
# Restart Command2
rm -f COMMAND2_failed; ("${COMMAND2[@]}"; touch COMMAND2_failed)&
fi
sleep 60
done
我在终端中运行了以下命令:
sudo chmod +x constantrun.sh # to make the script executable
然后我授予我的 python 脚本权限,例如chmod +x /home/pi/project/script1.py
接下来,为了初始化脚本,我使用了:
sudo sh constantrun.sh
但是,我收到以下错误消息:
/usr/bin/env: ‘python\r’: No such file or directory
/usr/bin/env: ‘python\r’: No such file or directory
constantrun.sh: 7: constantrun.sh: Bad substitution
constantrun.sh: 8: constantrun.sh: Bad substitution
我该如何解决这些错误?
答案1
问题\r
通常是由使用 Windows 编辑器引起的。检查你的 python 脚本。命令变量的赋值包含空格。您可以使用数组语法来引用它们,但不要将它们定义为数组。为了PYTHONPATH
有用,它必须被导出。
对于这个问题有一个更简单的解决方案:
#!/bin/sh
export PYTHONPATH=/home/pi/.local/lib/python2.7/site-packages
COMMAND1="python /home/pi/project/script1.py"
COMMAND2="python /home/pi/project/script2.py"
(while true; do $COMMAND1; done &)
(while true; do $COMMAND2; done &)
答案2
我认为这里有两个重要问题:
第一的:您必须区分 python 可执行文件的位置和 lib 站点包的位置。
你的 python 站点包在这里:
/home/pi/.local/lib/python2.7/site-packages
但你的可执行文件在这里:
/usr/bin
当您运行该命令时,which python
它告诉您可执行文件位于/usr/bin
您的 $PATH 环境变量应包含具有可执行文件的路径,即
$ echo $PATH /usr/bin:/usr/local/bin:/home/User/bin
如果您的可执行文件位于路径以外的其他位置,并且您不想将该位置添加到您的路径中,那么您可以只创建符号链接。例如:
ln -s /path/to/executable /usr/bin/executable
第二:您已经在 Windows 中创建了 python,然后将脚本移至 Linux 环境,可能您的脚本包含CR
字符,或dos breaks
.您可以按如下方式清除脚本中的 CR 字符:
vi +':wq ++ff=unix' script1.py
vi +':wq ++ff=unix' script2.py
或者简单地打开脚本“script1.py”和“script2.py”,emacs
然后再次保存它们。这将自动删除 CR 字符。