搭建属于你的科研平台
背景
在CS、EE相关的领域,我们往往会做一些实验。比如smart health,近几年学术界希望做到device free,即不需要任何的贴片传感器贴在人体身上,通过手机自带的传感器,实现一个app获取、分析、返回结果。
坦白说科研圈子的代码功底无法与工业界的技术大佬们相比,因此如果基于android框架在手机端开发一套能够手机本地处理的算法。一方面手机的运算能力较弱、另一方面需要考虑UI、事务线程的分层。往往算法部分用matlab、python是比较常见的。
此demo以手机端安卓应用为例+后端算法(部署于服务器)基于flask-server搭建。旨在于搭建一套能够将手机端的文件:*.csv / .wav / .txt/ .xlsx/ ……等科研结果传输到服务器,算法处理完结果后以http response的方式返回。手机端可自行编写handler方法,进行toast等方式的UI显示。
主要步骤
接下来讲解如何从0开始搭建这个框架:
1. Python搭建虚拟环境:
原本打算使用docker的方式,这样本地测试完毕基本上就docker一包上云开始用。考虑到阿里云服务器的存储资源有限,就不装镜像占硬盘了~还是一个项目一个虚拟环境吧。
修改conda 和 pip为清华镜像源
pip方法
- 临时使用: 可以在使用pip的时候加参数
-i https://pypi.tuna.tsinghua.edu.cn/simple
例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent
,这样就会从清华这边的镜像去安装gevent
库。 - 永久修改,一劳永逸:
- linux下,修改
~/.pip/pip.conf
(没有就创建一个), 修改 index-url至tuna,内容如下:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
- windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
conda 方法
用pip的virtualenv创建虚拟环境
- 安装虚拟环境的第三方包 virtualenv :
pip install virtualenv
- 使用清华源安装:
pip install -i https://pypi.python.org/simple/ virtualenv
创建虚拟环境
cd 到存放虚拟环境的地址
,比如cd ~/IT/algo-backend/
virtualenv venv
在当前目录下创建名为ENV
的虚拟环境(如果第三方包virtualenv安装在python3下面,此时创建的虚拟环境就是基于python3的)
virtualenv -p /usr/local/bin/python3.6 venv
参数 -p 指定python版本3.6创建虚拟环境venv
virtualenv --system-site-packages venv
参数 --system-site-packages 指定创建虚拟环境时继承系统三方库
note:由于flask推出初版时间为2010年,更倾向于python3+,尽量使用python3.5以后的版本。
激活/退出虚拟环境
cd ~/algo-backend
跳转到虚拟环境的文件夹
source venv/bin/activate
激活虚拟环境
pip list
查看当前虚拟环境下所安装的第三方库
deactivate
退出虚拟环境
基于conda创建虚拟环境
- 创建虚拟环境
conda create -n Algo-One-Backend python==3.7
这样就创建了一个名字为ENV,基于python版本3.6的一个虚拟环境了。注意,这里和pip建立的虚拟环境不同,pip建立的虚拟环境会直接在当前目录下生成一个虚拟环境的目录,激活虚拟环境也需要指定这个目录才行。而conda安装的虚拟环境,只会把虚拟环境的目录生成在anaconda安装目录下的env目录下。所以,conda创建的虚拟环境有一个很大的优点就是不用指定虚拟env的路径,不过前提是你需要把conda的环境变量早早设置好。
-
激活/退出虚拟环境
source activate Algo-One-Backend
激活虚拟环境
source deactivate
退出虚拟环境扫描二维码关注公众号,回复: 8793170 查看本文章 -
安装所需的第三方库
conda install -n Algo-One-Backend [package]
其中-n代表 name: Algo-One-Backend 指定了该虚拟环境
也可以在激活虚拟环境的状态下运行pip install [package]
-
查看conda环境下所有的虚拟环境
conda info --envs
删除虚拟环境
直接删除虚拟环境所在目录即可
2. 安装依赖
- 安装
requirements.txt
,如下预提供一份,自行创建requirements.txt
后,将以下内容复制即可
backcall==0.1.0
Click==7.0
decorator==4.4.1
Flask==1.1.1
Flask-SocketIO==4.2.1
gevent==1.4.0
greenlet==0.4.15
gunicorn==20.0.4
ipython==7.10.1
ipython-genutils==0.2.0
itsdangerous==1.1.0
jedi==0.15.1
Jinja2==2.10.3
joblib==0.14.1
MarkupSafe==1.1.1
numpy==1.17.4
pandas==0.25.3
parso==0.5.1
pexpect==4.7.0
pickleshare==0.7.5
prompt-toolkit==3.0.2
ptyprocess==0.6.0
Pygments==2.5.2
python-dateutil==2.8.1
python-engineio==3.11.2
python-socketio==4.4.0
pytz==2019.3
scikit-learn==0.22
scipy==1.3.3
six==1.13.0
sklearn==0.0
traitlets==4.3.3
wcwidth==0.1.7
Werkzeug==0.16.0
- 安装依赖文件,
pip install -r requirements.txt
- 使用过程中如果安装了新的包,可以通过
pip freeze > requirements.txt
更新该依赖文件。
3. 本地运行flask后端
- github下载/clone demo,欢迎star/pull request etc. 哈!
- 可以用
gunicorn demo.app:app -c gunicorn.conf.py
来启动程序,demo.app指在项目的根目录下运行这条命令时,app.py
在demo/
文件夹下,要定义好demo.app
才能找到启动程序入口
4. 部署到服务器(实验室服务器or公有云)
- 按照1.步骤中
ssh
到服务器,把虚拟环境搭建起来 - 把本地测试完的文件通过ftp的方式传输到server
- 把自己的文件正式部署完
gunicorn.conf.py
里面默认定义线程为3个,提高响应能力。大家在里面定义自己的程序端口,用之前先看一下系统中哪些端口已经被占用了netstat -ntulp
一大段列表里面找8888以后空余的端口。- 依次使用端口
8888\8889\8890\8891……
然后发现8890还没人用,就把gunicorn.conf.py
的端口改掉 - 由于想要让程序一直在后台运行,命令改为
nohup gunicorn demo.app:app -c gunicorn.conf.py
就可以了
5. 附录
注意点:flask 包导入的问题:如果没有写过多层级的flask模块,大家可能在文件分层管理会遇到一些困难。 Python在不同目录下导入模块的方法