python 打包 无需安装运行环境_python如何打包脚本(库也一起打包),直接在linux环境运行,不需要安装库?...

在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

大功告成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值