在linux下,一个pip就够了。
linux是开发友好的。类似的事情非常简单,所以你看不到太多这方面的文档。
在此我们假设目标linux上已经有python了,毕竟这是服务器标配。
假如我们有以下fiblife工程
fiblife
├── app.py
├── dep
├── requirement.txt
└── src
我们可以把所有的依赖库直接安装到工程目录中的dep目录里去。
通过pip可以从pypi安装各种依赖库,包括从github
$> pip install -t dep pymysql
$> pip install -t dep git+https://github.com/nikoloss/pyfadeaway.git
当然,你也可以通过requirement.txt来安装
$> pip install -t dep -r requirement.txt
之后你会发现dep就有了相应的依赖库了。
当然如果你直接执行app.py肯定是找不到dep里面的依赖的,有一个环境变量是专门干这个事情的,那就是PYTHONPATH,所以两个办法,要么改造app.py设置环境这个环境变量
import os
proj_dir = os.path.dirname(os.path.abspath(__file__))
os.environ['PYTHONPATH'] = os.path.join(proj_dir, 'dep')
import pymyal
这种做法对开发阶段不友好,而且是无法在比如vscode中进行dep中的库提示的。所以通常我们会写一个shell脚本来启动app.py
cd `dirname`
export PYTHONPATH=$PYTHONPATH:dep
env python3 app.py
如果我们需要在vscode中开发,让ide提示dep中的库,只需要下载python和python extenssion,然后在fiblife工程目录下新建一个.env文件,内容如下
PYTHONPATH=dep
重启vscode就OK了。
需要注意的点。
python依赖库主要有3种:纯python写的库,比如pyaes,pymysql,pyyaml
python+so库,比如simplejson,cjson,mysqldb
需要生成可执行文件,比如gunicorn
如果你的依赖库是第一种类型,也就是纯python写的,那这种方式可以很好的cover住,不管目标linux是arm还是x86,是32位还是64位,只要python版本一致将行。
如果是第二种,你就需要跟目标环境一致了,否则你安装到dep里的so库是不能运行的。
第三种情况在安装依赖的时候参照第二点,安装完成之后在dep目录下会生成一个bin目录,所以执行的时候需要加上 dep/bin/xxx比如
dep/bin/gunicorn -w 3 app:app
但是有一个不能忽视的点在于,如果dep/bin/xxx是二进制的那么这么用问题不大。但是如果是python写的,那么很有可能这么执行会报错找不到python路径,这是因为安装的时候,生成这个python文件的第一行 #!/usr/share/local/python/python3 是根据你自己的机器来的,目标机器上面的python路径很可能跟你这个路径对不上。咋办呢?直接指定python将行了
cd `dirname`
export PYTHONPATH=$PYTHONPATH:dep
python3 dep/bin/gunicorn -w 3 app:app
大功告成。