1. 使用邮件通知程序运行完毕
首先,参考[https://blog.csdn.net/eswai/article/details/53454987]
最后,在matlab命令行使用pcode('mailMe')
来得到一个.p文件,并实际使用.p文件提供的mailMe函数来防止授权码泄露问题。(我的话我的项目用git同步,所以写了个.gitignore来忽略mailMe.m文件)
2. 使用邮件来设置程序参数并运行
使用python来获取收件箱状态,并调用matlab函数。
首先要确定matlab版本支持的python版本,如R2017a支持2.7\3.5\3.6。
其次到matlab安装路径(不知道路径打开matlab,运行matlabroot
得到路径)如:\MATLAB\R2017a\extern\engines\python下,用cmd\bash\etc 运行python setup.py install
。
现在你就可以在python中运行matlab函数了。more about matlab python API
如下:
import matlab.engine
eng = matlab.engine.start_matlab()
t = eng.gcd(100.0,80.0,nargout=3)
print(t)
(20.0, 1.0, -1.0)
其中gcd可以替换成你的任意函数,注意nargout
参数控制输出个数,如果是普通脚本文件就填0
当然,不保证其他版本操作方式相同(我是R2017a\win10):P
接下来,要让python接受并解析邮件,参考廖雪峰的教程使用POP3。
然后主要要解决的问题是
- 如何识别出某个邮件是命令邮件
- 如何提取命令
以下是我的很粗劣的代码,核心代码为eval('eng.'+cmd)
。
比如我用这个邮箱给自己发了一封邮件标题为cmd mailMe('title','content',nargout=3)
,
然后就会运行eng.mailMe('title','content',nargout=3)
,然后的确收到了邮件,测试通过
# -*- coding: utf-8 -*-
import poplib
import time
import matlab.engine
email = None # 你的email
password = None # 你的pop3授权码
pop3_server = 'pop.126.com' # 换成你的邮件服务商的server
while True:
server = poplib.POP3_SSL(pop3_server)
# 认证:
server.user(email)
server.pass_(password)
num,total_size = server.stat()
# 获取最新一封邮件, 注意索引号从1开始:
resp, lines, octets = server.retr(num)
# 解析邮件:
flag1 = False
flag2 = False
for line in lines:
# 确认是发出的邮箱和自己相同,过滤掉大部分其他邮件
if line.find('From')==0:
if line[6:] == email:
flag1 = True
#找到标题栏,
if flag1 and line.find('Subject')==0:
cmd = line[9:]
if cmd.find('cmd')==0:
cmd = cmd[4:]
flag2 = True
break
if flag2:
eng = matlab.engine.start_matlab()
server.dele(num) # 删除邮件防止乱来
eval('eng.'+cmd)
eng.quit()
# 关闭连接:
server.quit()
# 沉睡5秒
time.sleep(5)
有很多改进空间,比如安全性等等,不过暂时就这样了吧。
update:请务必考虑一下读取了一封邮件的命令之后如何处理这封邮件!毕竟现在就是很简单的执行最新邮件的命令