Cronjob:Python脚本未写入文件

Cronjob:Python脚本未写入文件,python,cron,raspbian,Python,Cron,Raspbian,我正在研究raspbian,并编写了一个python脚本,它通过RS232和一些和Raspberry的pysical IO状态相关的硬件进行通信。它还写入日志文件 从命令行启动脚本时,一切正常: pi@raspberrypi~/scripts$python steppercontrol.py 我将纸条添加为cronjob(sudocrontab-e) 该脚本可以工作,并在重新启动后运行,但日志文件未写入 syslog提供了以下内容 cat /var/log/syslog | grep CRON

我正在研究raspbian,并编写了一个python脚本,它通过RS232和一些和Raspberry的pysical IO状态相关的硬件进行通信。它还写入日志文件

从命令行启动脚本时,一切正常:
pi@raspberrypi~/scripts$python steppercontrol.py

我将纸条添加为cronjob(
sudocrontab-e

该脚本可以工作,并在重新启动后运行,但日志文件未写入 syslog提供了以下内容

cat /var/log/syslog | grep CRON
May 29 12:05:16 raspberrypi /USR/SBIN/CRON[2106]: (CRON) info (No MTA installed, discarding output)
May 29 12:17:01 raspberrypi /USR/SBIN/CRON[2456]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
May 29 13:17:01 raspberrypi /USR/SBIN/CRON[2509]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
chmods应该可以:

pi@raspberrypi ~/scripts $ ls -lh
total 16K
-rwxr-xr-x 1 pi pi 3.1K May 27 12:55 steppercontrol.py
-rwxrwxrwx 1 pi pi  249 May 29 12:05 stepperlog
在我看来,它与python本身无关。我也无法将stdout从脚本(作为cronjob)重定向到文件。我迷路了,这是我的剧本:

顺便说一句:这是我的第一个python脚本,通常我对linux不是很在行,但raspbian和google让事情变得简单;-)

导入序列号
导入时间
将PiFaceDigital IO导入为p
导入日期时间
#通过忙等待读取数据的函数
#超时为启用,非阻塞
def getData(p):
“让数据忙着等待”
d=“”
如果p.inWaiting()0:
d+=p.read(1)
返回d
#功能结束
#主程序登录
#初始化串行通信
端口=serial.serial(“/dev/ttyUSB0”,字节大小=serial.EIGHTBITS,波特率=9600,停止位=serial.stopbits,超时=1.0)
p、 init()
对于范围(0,8)内的i:
p、 数字写入(i,0)
p、 数字写入上拉(i,1)
日志文件=打开('/home/pi/scripts/stepperlog','a')
i=datetime.datetime.now()
logfile.write(str(i)+“脚本已启动\n”)
打印(str(i)+“脚本已启动\n”)
#查询hello world字符串并将答案写入屏幕
端口写入(“?版本\r”)
d=getData(端口)
打印(“>>”+d+“\n”)
port.write(“!a\r”)
#设置步进驱动器
port.write(“!轴1 0\r”)#禁用X轴以外的所有轴
端口。写入(“!节距1\r”)#设置杆节距。。。需要?
端口写入(“!cur 1\r”)#将每个电机的电流设置为1 A
port.write(“!accel 0.5 0.5 0.5\r”)#将加速度设置为m/s^2的值
端口写入(“!velfac 0.1 0.1 0.1\r”)#将速度降低facor 1/10
pinList=[0,0,0,0,0]
prevSelection=-2
而1:
对于范围(0,6)内的i:
pinList[i]=p.digital_read(i)
p、 数字写入(i,pinList[i])
#打印(“>>I/O”+str(I)+:“+str(pinList[I]))
速度=0;
选举结果=-1
如果pinList[0]==1:#位置1
速度=5;#快速向下移动5毫米/秒
选举结果=0
elif pinList[1]==1:#位置3
速度=-0.1;#向上移动50 um/s
选举结果=1
elif pinList[2]==1:#位置5
速度=-0.2;#向上移动100 um/s
选举结果=2
elif pinList[3]==1:#位置7
速度=-0.3;#向上移动100 um/s
选举结果=3
elif pinList[4]==1:#位置9
速度=-0.4;#向上移动100 um/s
选举结果=4
elif pinList[5]==1:#位置11
速度=-5;#快速向上移动5毫米/秒
选举结果=5
calcspeed=浮动(速度)
calcspeed*=10/1.36#系数10/100对应于从上方减速!
如果选举失败!=选择:
i=datetime.datetime.now()
logfile.write(str(i)+“”+str(prevSelection)+“”+str(curSelection)+“”+str(speed)+“”+str(calcspeed)+“\n”)
打印(str(i)+“”+str(prevSelection)+“”+str(curSelection)+“”+str(speed)+“”+str(CalcPeed))
prevSelection=curSelection
speed=“%.10f”%calcspeed#浮动到字符串
端口写入(“!speed”+speed+“\r”)
等待=0.1
时间。睡眠(浮动(等待))

您的cron作业正在向stdout或stderr写入内容-cron会收集这些内容并尝试将其发送给您,但您的系统未安装MTA(因此会显示日志消息“未安装MTA”)。尝试将stderr和stdout重定向到一个文件,您可能会得到关于问题所在的更多信息

或者,您可以安装MTA并让它向您发送输出-这将有助于您解决将来在cron任务中遇到的任何其他问题:

sudo-apt-get-install-postfix


最终答案是显而易见的! 我没有刷新输出。对于标准输出,标准输出:

import sys
sys.stdout.flush()
sys.stderr.flush()
对于打开的文件:

logfile.flush()

cron不会运行您的profile和.bashrc,因此并不总是设置适当的环境变量。如果让我猜的话,我会认为你错过了你的
PYTHONPATH
。您可以
echo$PYTHONPATH
从终端查看正确运行脚本应该是什么,然后在crontab中添加一行
PYTHONPATH=…
来设置它。。。PYTHONPATH确实让我感到困惑,因为它在我的终端(bash)中是emtpty,脚本运行良好
pi@raspberrypi~$echo$PYTHONPATH
。。。。编辑此处没有可见的换行符。。。echo的输出为Nothing此编辑器窗口有问题。。。如何添加换行符?很抱歉格式化,这是我的文本:。。。。。。。。。。。。。。。。。。。。。。。我尝试重定向输出(stderr和stdout)
@reboot/usr/bin/python/home/pi/scripts/steppercontrol.py>>/home/pi/scripts/log.txt 2>&1#*/1****/usr/bin/python/home/pi/scripts/testlog.py>/home/pi/scripts/log.txt 2>&1
。。。。。。。。。。。。。。第一行不行,第二行不行。插入后缀不会改变任何东西。没想到会这样,但尝试了。。。。。。有点奇怪。上面的第二个脚本每分钟执行一次,执行完全相同的操作(写入文件和标准输出,两者都被记录和接收)。唯一的区别是计时语句(@reboot和everyminute)
import sys
sys.stdout.flush()
sys.stderr.flush()
logfile.flush()