人生苦短,我用 Python~
一直想自己折腾些极客的东西出来,供自己使用或者是供他人使用。一则可能对自己的生活是一种帮助,二则是对自己技能的提高,三则显得高大上,一直努力,一直提高,一直 Happy!~
直到,在京东白条了一个树莓派 3,我知道,有一段兴奋的苦旅要开始了...
本文拟使用 Python 开发一个智能时钟,并且将智能时钟部署在 树莓派 3 微机上,7*24 小时开机,以达到实时监控时钟并在适当的时侯作出响应的目的。其实是每天早上邪恶的提示语,加一段提示音乐。每天中午吵醒午睡的闹钟,房东在没人的时候进屋能吓他一跳...zzzhhh
这篇文章将要介绍的主要内容如下:
1、早上闹钟,天气预报,音乐提醒
2、整点报时,半点报时
1、python 对天气网站信息的 web 爬虫爬取
2、通过分析爬取的数据,并拼接需要语音播报的文本
3、调用百度的语音合成 api 进行语音文本转化成 mp3
4、使用 python 脚本将 mp3 下载到本地
5、设置计划任务,每分钟检测一下当前时间是否满足条件
6、早上闹钟 + 天气预报 + 音乐,整点报时,半点响音
开发环境:Windows 7 ×64 英文版
JetBrains PyCharm 2017.1.3 x64
部署环境:Raspberry Pi 3 Ubuntu OS
1、Python 语言的熟练掌握, Python 版本 2.7
2、利用 Python 语言,实现 web 爬虫,网络爬虫的理解
3、正则表达式的简单使用
4、BeautifulSoup html 解析库的使用
5、linux 常用命令的熟练掌握
首先附上程序结构:
我们这次写的 py 文件是 main_SmartClock.py , 然后还有个配置文件 qx_shs.ini、配置文件全局读取 ConfigField.py ,GetWeatherText.py 爬取墨迹天气的 py 脚本,TextToAudio.py 将文本转化成语音的脚本。我们可能主要用到这几个 py 文件。
1、首先是配置 ini 配置文件
- 1 [System]
- 2OWNER = 东爷;语音播报的名字
- 3
- 4 [ClockTime]
- 5CLOCK_MORNING_AWAKE = 7:16 6CLOCK_MORNING_GO = 8:30 7CLOCK_NOON = 13:30 8CLOCK_AFTERNOON = 19:00 9CLOCK_EVENING = 23:0010
- 11 [CameraRecognition]
- 12IMAGE_SIMILARITY = 0.85;视屏监控图片匹配相似度
- 13SAMPLE_IMAGES_NAME = 东爷;图片样本名称
- 14
- 15 [Text]
- 16ATTACK_ALERT_TEXT = Some People Attack
- 17ALERT_TXT_MORNING = 早上好,美好的一天开始啦
- 18ALERT_TXT_NOON = 中午好,小憩一下,睡个午觉,美美哒
- 19ALERT_TXT_AFTERNOON = 下午好,夕阳无限好,只是近黄昏啊
- 20ALERT_TXT_NIGHT = 晚上好,夜深了,早点休息吧,记得睡前喝牛奶哦
- 21ALERT_TXT_OFF_WORK = 您下班啦,工作一天累了吧,休息一下吧
- 22ALERT_TXT_HELLO = '您好'
- 23
- 24
- 25 [Path]
- 26MP3_ALERT = soundFiles/alert.mp3
- 27MP3_START = soundFiles/start.mp3
- 28MP3_NORMAL = soundFiles/chengdu.mp3
- 29MP3_WEATHER = soundFiles/weatherGreeting.mp3
- 30MP3_MORNING_AWAKE = soundFiles/piaoyangguohailaikanni.mp3
- 31MP3_MORNING_GO = soundFiles/chengdu.mp3
- 32MP3_NOON = soundFiles/shiguangzhenghao.mp3
- 33MP3_AFTERNOON = soundFiles/wenwendexinfu.mp3
- 34MP3_EVENING = soundFiles/guqin.mp3
- 35MP3_HALF_HOUR = soundFiles/short2.mp3
- 36MP3_HOUR = soundFiles/short3.mp3
- 37MP3_BACKGROUND = soundFiles/background2.mp3
- 38
- 39CLASSIFIER_PATH = Resources/haarcascade_frontalface_default.xml
- 40SAMPLE_IMAGES_SAVE_PATH = sampleImages/
- 41CAMERA_MONITORING_FILES_PATH = cameraMonitoringFiles/
2、然后是对配置文件的读取,并设置到全局变量,因为我好几个主要 py 文件都要调用这几个全局变量,所以我就直接设置在全局了,避免重复获取 ini 文件
- 1 # coding=utf-8
- 2 import ConfigParser
- 3
- 4 # 树莓派的ubuntu系统里面如果要使用计划任务,则必须写成绝对路径,意味着这里需要加前缀
- 5 # RASPBERRY_PI_PATH_ROOT = '/root/C/'
- 6 # RASPBERRY_PI_PATH_PROJECT = 'QX_SHS/'
- 7
- 8 # Windows调试不需要加绝对路径
- 9RASPBERRY_PI_PATH_ROOT =''
- 10RASPBERRY_PI_PATH_PROJECT =''
- 11
- 12RASPBERRY_PI_PATH_PLUS = RASPBERRY_PI_PATH_ROOT + RASPBERRY_PI_PATH_PROJECT
- 13
- 14HEADERS = {
- 15 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit'
- 16 '/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safar'
- 17 'i/537.36',
- 18 }
- 19
- 20 # get configuration
- 21config = ConfigParser.ConfigParser()
- 22config.readfp(open(RASPBERRY_PI_PATH_PLUS +'qx_shs.ini'))
- 23
- 24 # 获取System
- 25OWNER = config.get('System','OWNER')
- 26
- 27 # 获取Text
- 28ATTACK_ALERT_TEXT = config.get('Text','ATTACK_ALERT_TEXT')
- 29ALERT_TXT_MORNING = config.get('Text','ALERT_TXT_MORNING')
- 30ALERT_TXT_NOON = config.get('Text','ALERT_TXT_NOON')
- 31ALERT_TXT_AFTERNOON = config.get('Text','ALERT_TXT_AFTERNOON')
- 32ALERT_TXT_NIGHT = config.get('Text','ALERT_TXT_NIGHT')
- 33ALERT_TXT_OFF_WORK = config.get('Text','ALERT_TXT_OFF_WORK')
- 34ALERT_TXT_HELLO = config.get('Text','ALERT_TXT_HELLO')
- 35
- 36 # 获取闹钟时间参数
- 37CLOCK_MORNING_AWAKE = config.get('ClockTime','CLOCK_MORNING_AWAKE')
- 38CLOCK_MORNING_GO = config.get('ClockTime','CLOCK_MORNING_GO')
- 39CLOCK_NOON = config.get('ClockTime','CLOCK_NOON')
- 40CLOCK_AFTERNOON = config.get('ClockTime','CLOCK_AFTERNOON')
- 41CLOCK_EVENING = config.get('ClockTime','CLOCK_EVENING')
- 42
- 43 # 获取CameraRecognition参数
- 44IMAGE_SIMILARITY = config.get('CameraRecognition','IMAGE_SIMILARITY')
- 45SAMPLE_IMAGES_NAME = config.get('CameraRecognition','SAMPLE_IMAGES_NAME')
- 46
- 47 # 获取路径
- 48MP3_ALERT = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_ALERT')
- 49MP3_START = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_START')
- 50MP3_NORMAL = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_NORMAL')
- 51MP3_WEATHER = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_WEATHER')
- 52MP3_MORNING_AWAKE = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_MORNING_AWAKE')
- 53MP3_MORNING_GO = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_MORNING_GO')
- 54MP3_NOON = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_NOON')
- 55MP3_AFTERNOON = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_AFTERNOON')
- 56MP3_EVENING = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_EVENING')
- 57MP3_HALF_HOUR = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_HALF_HOUR')
- 58MP3_HOUR = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_HOUR')
- 59MP3_BACKGROUND = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_BACKGROUND')
- 60
- 61CLASSIFIER_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path','CLASSIFIER_PATH')
- 62SAMPLE_IMAGES_SAVE_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path','SAMPLE_IMAGES_SAVE_PATH')
- 63CAMERA_MONITORING_FILES_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path','CAMERA_MONITORING_FILES_PATH')
3、使用 requests 库进行对墨迹天气网站信息的爬取 http://tianqi.moji.com/,网络爬虫的代码我就不进行介绍了,代码里面也有详细的注释,要注意对其他文件的调用,包导入。
- 1 # coding=utf-8
- 2
- 3 # RASPBERRY_PI_PATH_ROOT 执行Ubuntu计划任务必须声明绝对路径
- 4RASPBERRY_PI_PATH_ROOT ='/root/C/'
- 5
- 6 import sys
- 7
- 8 sys.path.append(RASPBERRY_PI_PATH_ROOT)
- 9 import re
- 10 import requests
- 11 frombs4import BeautifulSoup
- 12 fromdatetimeimport datetime
- 13 fromHelper_DG.DateTimeHelper_DGimport* 14 fromQX_SHS.ConfigFieldimport* 15
- 16 reload(sys)
- 17sys.setdefaultencoding('utf8')
- 18
- 19
- 20 def numtozh(num):
- 21num_dict = {1:'一', 2:'二', 3:'三', 4:'四', 5:'五', 6:'六', 7:'七',
- 228:'八', 9:'九', 0:'零'}
- 23num = int(num)
- 24 if100 <= num < 1000:
- 25b_num = num // 100 26s_num = (num - b_num * 100) // 10 27g_num = (num - b_num * 100) % 10 28 ifg_num == 0ands_num == 0:
- 29num ='%s百'% (num_dict[b_num])
- 30 elifs_num == 0:
- 31num ='%s百%s%s'% (num_dict[b_num], num_dict.get(s_num,''), num_dict.get(g_num,''))
- 32 elifg_num == 0:
- 33num ='%s百%s十'% (num_dict[b_num], num_dict.get(s_num,''))
- 34 else:
- 35num ='%s百%s十%s'% (num_dict[b_num], num_dict.get(s_num,''), num_dict.get(g_num,''))
- 36 elif10 <= num < 100:
- 37s_num = num // 10 38g_num = (num - s_num * 10) % 10 39 ifg_num == 0:
- 40g_num =''
- 41num ='%s十%s'% (num_dict[s_num], num_dict.get(g_num,''))
- 42 elif0 <= num < 10:
- 43g_num = num
- 44num ='%s'% (num_dict[g_num])
- 45 elif-10 < num < 0:
- 46g_num = -num
- 47num ='零下%s'% (num_dict[g_num])
- 48 elif-100 < num <= -10:
- 49num = -num
- 50s_num = num // 10 51g_num = (num - s_num * 10) % 10 52 ifg_num == 0:
- 53g_num =''
- 54num ='零下%s十%s'% (num_dict[s_num], num_dict.get(g_num,''))
- 55 return num
- 56
- 57
- 58 # timeRegion 时间区间 1=早上,2=中午,3=傍晚,4=夜晚,其他=现在
- 59 def get_weather(name, timeRegion):
- 60 # 下载墨迹天气主页源码
- 61res = requests.get('http://tianqi.moji.com/', headers=HEADERS)
- 62 # 用BeautifulSoup获取所需信息
- 63soup = BeautifulSoup(res.text,"html.parser")
- 64address = soup.find('div', attrs={'class':'search_default'}).em.getText()
- 65temp = soup.find('div', attrs={'class':'wea_weather clearfix'}).em.getText()
- 66temp = numtozh(int(temp))
- 67weather = soup.find('div', attrs={'class':'wea_weather clearfix'}).b.getText()
- 68sd = soup.find('div', attrs={'class':'wea_about clearfix'}).span.getText()
- 69sd_num = re.search(r'\d+', sd).group()
- 70sd_num_zh = numtozh(int(sd_num))
- 71sd = sd.replace(sd_num, sd_num_zh)
- 72wind = soup.find('div', attrs={'class':'wea_about clearfix'}).em.getText()
- 73aqi = soup.find('div', attrs={'class':'wea_alert clearfix'}).em.getText()
- 74aqi_num = re.search(r'\d+', aqi).group()
- 75aqi_num_zh = numtozh(int(aqi_num))
- 76aqi = aqi.replace(aqi_num, aqi_num_zh).replace(' ',',空气质量')
- 77info = soup.find('div', attrs={'class':'wea_tips clearfix'}).em.getText()
- 78sd = sd.replace(' ','百分之').replace('%','')
- 79aqi ='aqi'+ aqi
- 80info = info.replace(',',',')
- 81 # 获取今天的日期
- 82timeNow = datetime.datetime.now()
- 83
- 84 # 将获取的信息拼接成一句话
- 85weatherText =''
- 86 iftimeRegion == 1:
- 87weatherText ='早上好!%s ,今天是%s年,%s月,%s日,星期%s,现在的时间是%s点,%s分。您所在的地区是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s 开始美好的一天吧,么么哒。'% \
- 88 (
- 89 name, timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
- 90 timeNow.minute, address,
- 91 weather, temp,
- 92 sd,
- 93 wind,
- 94 aqi, info)
- 95 eliftimeRegion == 2:
- 96weatherText ='中午好!%s ,今天是%s年,%s月,%s日,星期%s,现在的时间是%s点,%s分。您所在的地区是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s 中午一定要记得休息哦,么么哒。'% \
- 97 (
- 98 name, timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
- 99 timeNow.minute, address,
- 100 weather, temp,
- 101 sd,
- 102 wind,
- 103 aqi, info)
- 104 eliftimeRegion == 3:
- 105weatherText ='下午好!%s ,今天是%s年,%s月,%s日,星期%s,现在的时间是%s点,%s分。您所在的地区是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s 忙了一天,累了吧,么么哒。'% \
- 106 (
- 107 name, timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
- 108 timeNow.minute, address,
- 109 weather, temp,
- 110 sd,
- 111 wind,
- 112 aqi, info)
- 113 eliftimeRegion == 4:
- 114weatherText ='晚上好!%s ,今天是%s年,%s月,%s日,星期%s,现在的时间是%s点,%s分。您所在的地区是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s 夜已深了,早点休息吧,么么哒。'% \
- 115 (
- 116 name, timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
- 117 timeNow.minute, address,
- 118 weather, temp,
- 119 sd,
- 120 wind,
- 121 aqi, info)
- 122 eliftimeRegion == 5:
- 123weatherText ='现在是,北京时间 %s年,%s月,%s日,星期%s,%s点,%s分。'% \
- 124 (
- 125 timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
- 126 timeNow.minute)
- 127 else:
- 128weatherText ='您好!%s ,今天是%s年,%s月,%s日,星期%s,现在的时间是%s点,%s分。您所在的地区是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s 么么哒。'% \
- 129 (
- 130 name, timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
- 131 timeNow.minute, address,
- 132 weather, temp,
- 133 sd,
- 134 wind,
- 135 aqi, info)
- 136
- 137 returnweatherText
4、接下来就是我们的主程序入口了,首先上代码,然后再进行介绍
- 1 # coding=utf-8
- 2
- 3 # RASPBERRY_PI_PATH_ROOT 执行Ubuntu计划任务必须声明绝对路径
- 4RASPBERRY_PI_PATH_ROOT ='/root/C/'
- 5
- 6 import sys
- 7
- 8 sys.path.append(RASPBERRY_PI_PATH_ROOT)
- 9 import os
- 10 fromFunctionCode.GetWeatherTextimport*11 fromFunctionCode.TextToAudioimport*12
- 13 # 播放器(totem)和音乐文件(The_Snow.mp3)需要用户指定,需要指定时间
- 14 def play_mp3_weather(time_index):
- 15 # 通过不同的时间,获取不同时间的天气信息
- 16text = get_weather(str(OWNER), time_index)
- 17 # 将文字信息转换成语音信息
- 18 text2voice(text, MP3_WEATHER)
- 19os.system("mpg321 {0}".format(str(MP3_WEATHER)))
- 20
- 21
- 22 if __name__=='__main__':
- 23
- 24timeNow = get_current_time()
- 25
- 26 print('{0} -> welcome to use qixiao`s program . starting ...'.format(timeNow))
- 27
- 28 # os.system("mpg321 {0}".format(str(MP3_START)))
- 29 # text = get_weather(str(OWNER), 0)
- 30 # print(text)
- 31
- 32 try:
- 33 # 获取特定格式的当前时间
- 34timeNowStringFormat = str('{0}:{1}'.format(timeNow.hour, timeNow.minute))
- 35 # 打印当前时间
- 36 # print('time now -> {0}'.format(timeNow))
- 37 # 进行时间判断,并在不同时间段进行对应的操作
- 38 iftimeNowStringFormat == CLOCK_MORNING_AWAKE:
- 39 print('{0} >>> morning ! it`s time to awake ... '.format(str(CLOCK_MORNING_AWAKE)))
- 40play_mp3_weather(1)
- 41os.system("mpg321 {0}".format(str(MP3_MORNING_AWAKE)))
- 42 iftimeNowStringFormat == CLOCK_MORNING_GO:
- 43 print('{0} >>> morning ! it`s time to go ... '.format(str(CLOCK_MORNING_GO)))
- 44play_mp3_weather(1)
- 45os.system("mpg321 {0}".format(str(MP3_MORNING_GO)))
- 46 eliftimeNowStringFormat == CLOCK_NOON:
- 47 print('{0} >>> good noon have a good mood ... '.format(str(CLOCK_NOON)))
- 48play_mp3_weather(2)
- 49os.system("mpg321 {0}".format(str(MP3_NOON)))
- 50 eliftimeNowStringFormat == CLOCK_AFTERNOON:
- 51 print('{0} >>> good afternoon it`s time to happy ... '.format(str(CLOCK_AFTERNOON)))
- 52play_mp3_weather(3)
- 53os.system("mpg321 {0}".format(str(MP3_AFTERNOON)))
- 54 eliftimeNowStringFormat == CLOCK_EVENING:
- 55 print('{0} >>> good night it`s time to sleep ... '.format(str(CLOCK_EVENING)))
- 56play_mp3_weather(4)
- 57os.system("mpg321 {0}".format(str(MP3_EVENING)))
- 58 # 整点报时功能 早7点以后,晚24点之前 除去13点午休时间
- 59 eliftimeNow.hour > 7andtimeNow.hour < 24andtimeNow.hour != 13andtimeNow.minute == 00:
- 60 print('# >>> integral point. ... ')
- 61os.system("mpg321 {0}".format(str(MP3_HOUR)))
- 62play_mp3_weather(5)
- 63 # 半点报时功能 早7点以后,晚24点之前 除去13点午休时间
- 64 eliftimeNow.hour >= 7andtimeNow.hour < 24andtimeNow.hour != 13andtimeNow.minute == 30:
- 65 print('# >>> half an hour ... ')
- 66os.system("mpg321 {0}".format(str(MP3_HALF_HOUR)))
- 67 else:
- 68 pass
- 69
- 70 except Exception:
- 71 print(str(timeNow) +' >>> '+ Exception)
该主程序通过方法获取到了当前的时间,并进行时间的匹配,对应的时间执行对应的操作。在主程序定义的方法中,我们进行对天气等信息的获取,并拼接字符串,调用百度声音合成 api 进行声音的获取及转化成 mp3,保存到本地,最后进行声音的播放。
5、百度接口的调用
- 1 # coding=utf-8
- 2
- 3 # RASPBERRY_PI_PATH_ROOT 执行Ubuntu计划任务必须声明绝对路径
- 4RASPBERRY_PI_PATH_ROOT ='/root/C/'
- 5
- 6 import sys
- 7
- 8 sys.path.append(RASPBERRY_PI_PATH_ROOT)
- 9 import requests
- 10 import json
- 11 fromQX_SHS.ConfigFieldimport*12
- 13 # 将文字转化成mp3 并保存到本地
- 14 def text2voice(text,mp3_path):
- 15urlGetToken ='https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=************&client_secret=************'
- 16
- 17token = requests.post(urlGetToken, headers=HEADERS)
- 18tokenJson = json.loads(token.content.decode(encoding="utf-8"))
- 19access_token = tokenJson['access_token']
- 20
- 21 # spd 语速 pit 音调 per 0 女 1 男
- 22url ='http://tsn.baidu.com/text2audio?tex={0}&lan=zh&cuid={1}&ctp=1&tok={2}&spd=4&pit=8&per=0'.format(text,'qixiao_text2audio',
- 23 access_token)
- 24 # 下载转换后的mp3格式语音
- 25res = requests.get(url, headers=HEADERS)
- 26 # 将MP3存入本地
- 27with open(mp3_path,'wb') as f:
- 28f.write(res.content)
通过调用百度的 api 接口,我们就可以将文字转化成声音啦,多种声音设置可以选择。
进行到这一步,我们就可以进行部署测试了。
1、使用 FTP 或任何方式将代码部署到 Raspberry Pi 上
2、由于树莓派是 ubuntu 系统,需要安装支持 mp3 播放的播放器,这里我采用 mpg321
安装 mpg321,终端输入命令:sudo apt-get install mpg123
等待片刻就可以安装好 mpg321 了,该命令可以直接跟 mp3 文件进行 mp3 的播放
mpg321 test.mp3
如果打开想要关闭的话,需要执行进程关闭命令:
killall mpg321 就可以关掉啦
3、将该 py 脚本添加到计划任务中去,并且使其每分钟执行一次,来扫描当前的时间
使用 crontab 命令,可以添加计划任务,终端运行命令
crontab -e 执行编辑任务
crontab -l 查看当前用户下的全部计划任务
第一次执行 crontab -e 会让你选择默认的编辑器,最后终于发现 vi 居然是最好用的。
添加计划任务的方法也很简单了,这里有模板可以参考:
每一项 cron 实体的内容都包含六个部分:分钟、小时、月份中的哪一天、年份中的哪一月、星期中的哪一天,还有定时执行的命令。
- # m h dom mon dow command
- # * * * * * command to execute
- # ┬ ┬ ┬ ┬ ┬
- # │ │ │ │ │
- # │ │ │ │ │
- # │ │ │ │ └───── 星期中的哪一天(0-7)(从0到6代表星期日到星期六,也可以使用名字;7是星期天,等同于0)
- # │ │ │ └────────── 月份 (1 - 12)
- # │ │ └─────────────── 月份中的日 (1 - 31)
- # │ └──────────────────── 小时 (0 - 23)
- # └───────────────────────── 分钟 (0 - 59)
例如我的计划任务是这么写的:
*/1 * * * * python2 /root/C/QX_SHS/main_SmartClock.py
*/1 的意思是每分钟执行一次。
我们设置完后,esc->shift+;->wq 回车
这样,计划任务就启动了。如果不出意外,能达到理想的效果。关于其他计划任务的命令,需要自行学习了。
这里附上我的大 PI 的写真~
由于要搁到下面的桌子上安装 opencv 所以显示器放在下面了,正常时候是在床上 很 "美观" 的 放置着的。
摄像头刚到,欸,继续去研究下一个课题,人脸识别问候系统 + 室内监控系统,代码已完成,正在跳部署的坑~~~(此处附上女友挚爱的~/ 摊手)
1、 部署到树莓派时候,可能装到计划任务,却没有反应;没关系,我们先将代码 main 方法里的 最上面写一段模拟的音乐播放,直接播放已经存在的路径里的音乐。
或者将我的注释取消掉即可,我本身也是做过测试的。
然后直接在终端运行我们计划任务里的命令,ok,如果报路径找不到之类的问题就对了。
计划任务里的脚本执行命令,和直接切换到脚本所在的目录执行的方式是不太一样的,总之,如果在根目录执行某一个带目录路径的脚本的话,所有的脚本里的相对路径都会找不到,那么我们只有拼接一个绝对路径到项目所有的目录前面了,这里我在 ConfigFeild.py 里面,最上面有两行注释进行了该操作。
再次附上 ConfigFeild.py 的代码:
- 1 # coding=utf-8
- 2 import ConfigParser
- 3
- 4 # 树莓派的ubuntu系统里面如果要使用计划任务,则必须写成绝对路径,意味着这里需要加前缀
- 5 # RASPBERRY_PI_PATH_ROOT = '/root/C/'
- 6 # RASPBERRY_PI_PATH_PROJECT = 'QX_SHS/'
- 7
- 8 # Windows调试不需要加绝对路径
- 9RASPBERRY_PI_PATH_ROOT =''
- 10RASPBERRY_PI_PATH_PROJECT =''
- 11
- 12RASPBERRY_PI_PATH_PLUS = RASPBERRY_PI_PATH_ROOT + RASPBERRY_PI_PATH_PROJECT
- 13
- 14HEADERS = {
- 15 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit'
- 16 '/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safar'
- 17 'i/537.36',
- 18 }
- 19
- 20 # get configuration
- 21config = ConfigParser.ConfigParser()
- 22config.readfp(open(RASPBERRY_PI_PATH_PLUS +'qx_shs.ini'))
- 23
- 24 # 获取System
- 25OWNER = config.get('System','OWNER')
- 26
- 27 # 获取Text
- 28ATTACK_ALERT_TEXT = config.get('Text','ATTACK_ALERT_TEXT')
- 29ALERT_TXT_MORNING = config.get('Text','ALERT_TXT_MORNING')
- 30ALERT_TXT_NOON = config.get('Text','ALERT_TXT_NOON')
- 31ALERT_TXT_AFTERNOON = config.get('Text','ALERT_TXT_AFTERNOON')
- 32ALERT_TXT_NIGHT = config.get('Text','ALERT_TXT_NIGHT')
- 33ALERT_TXT_OFF_WORK = config.get('Text','ALERT_TXT_OFF_WORK')
- 34ALERT_TXT_HELLO = config.get('Text','ALERT_TXT_HELLO')
- 35
- 36 # 获取闹钟时间参数
- 37CLOCK_MORNING_AWAKE = config.get('ClockTime','CLOCK_MORNING_AWAKE')
- 38CLOCK_MORNING_GO = config.get('ClockTime','CLOCK_MORNING_GO')
- 39CLOCK_NOON = config.get('ClockTime','CLOCK_NOON')
- 40CLOCK_AFTERNOON = config.get('ClockTime','CLOCK_AFTERNOON')
- 41CLOCK_EVENING = config.get('ClockTime','CLOCK_EVENING')
- 42
- 43 # 获取CameraRecognition参数
- 44IMAGE_SIMILARITY = config.get('CameraRecognition','IMAGE_SIMILARITY')
- 45SAMPLE_IMAGES_NAME = config.get('CameraRecognition','SAMPLE_IMAGES_NAME')
- 46
- 47 # 获取路径
- 48MP3_ALERT = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_ALERT')
- 49MP3_START = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_START')
- 50MP3_NORMAL = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_NORMAL')
- 51MP3_WEATHER = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_WEATHER')
- 52MP3_MORNING_AWAKE = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_MORNING_AWAKE')
- 53MP3_MORNING_GO = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_MORNING_GO')
- 54MP3_NOON = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_NOON')
- 55MP3_AFTERNOON = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_AFTERNOON')
- 56MP3_EVENING = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_EVENING')
- 57MP3_HALF_HOUR = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_HALF_HOUR')
- 58MP3_HOUR = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_HOUR')
- 59MP3_BACKGROUND = RASPBERRY_PI_PATH_PLUS + config.get('Path','MP3_BACKGROUND')
- 60
- 61CLASSIFIER_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path','CLASSIFIER_PATH')
- 62SAMPLE_IMAGES_SAVE_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path','SAMPLE_IMAGES_SAVE_PATH')
- 63CAMERA_MONITORING_FILES_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path','CAMERA_MONITORING_FILES_PATH')
这下应该可以理解为什么需要在每个路径前面拼接了一段了,如果在 windows 下,用 当前的拼接值,如果在树莓派,则上面注释的两行,写上自己的目录绝对路径值。
当然了,每个脚本最上面,为了引用其他文件夹里的脚本,我也进行了相应的操作:
- 1 # coding=utf-8
- 2
- 3 # RASPBERRY_PI_PATH_ROOT 执行Ubuntu计划任务必须声明绝对路径
- 4RASPBERRY_PI_PATH_ROOT ='/root/C/'
这里按需求来吧。
1、音乐调取网易云的每日推荐歌单,改掉现在每日播放重复歌曲的情况
来源: http://www.cnblogs.com/qixiaoyizhan/p/7128075.html