这几天为了搞个微信机器人, 在 Node.js
和 Python
之中纠结来纠结去, 最终由于 Node.js
复杂的依赖处理放弃了, 选择了 Python
, 花了些时间搞了几天, 突然发现当初因为感觉 Python
是门胶水语言而对它嗤之以鼻, 现在真是追悔莫及.
讲道理, Python
确实香, 平时想搞个小工具, 一直都是轻量的 shell
重量的 java/kotlin
, kotlin
虽好但架不住需要专门安装运行时环境, 并且 jvm
内存消耗大, 自己的羊毛服务器稍微跑几个 jvm
内存就所剩无几, 直到这几天用 Python
搞出来了这个微信机器人, 才发现这不是就是我一直在找的东西吗?
- 简单上手快
- 消耗内存小
- 能写带界面的程序
- 支持编译为可执行文件
- 和
Node.js
比较安装依赖简洁且包体积小
综上所述, 简直是用来作为一个工具语言的首选!
好了, 切入正题, 开个文章来记录一下 Python
使用上的一些常用但容易忘的内容.
安装
安装这个很简单, Windows
下直接下载安装包, Linux
下通过包管理器直接安装, 基本都可以直接安装上.
配置 pip
加速
pip
是 Python
的包管理器, 效果类似 Debian
之 apt
, CentOS
之 yum
.
通过 pip
可以很方便的安装上 Python
三方包.
由于 pip
的仓库 https://pypi.org/ 服务器在美国, 在我国访问可能不是很顺畅, 所以可能需要给 pip
搞个加速, 按照使用场景分为一次性配置和永久配置:
一次性配置
一次性配置只对当前执行的 install
有效, 只需要在 install
加上 -i
参数, 后跟镜像地址就可以了:
pip install {package_name} -i {url}
pip install requests -i https://pypi.douban.com/simple/
永久配置
永久配置需要写配置文件, 之后所有的 install
都会自动走改镜像仓库:
Windows
mkdir %USERPROFILE%\pip
echo [global] > %USERPROFILE%\pip\pip.ini
echo index-url = https://pypi.tuna.tsinghua.edu.cn/simple >> %USERPROFILE%\pip\pip.ini
echo [install] >> %USERPROFILE%\pip\pip.ini
echo trusted-host = pypi.tuna.tsinghua.edu.cn >> %USERPROFILE%\pip\pip.ini
Linux
mkdir -p ~/.pip/
cat > ~/.pip/pip.conf <<EOF
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF
常用的镜像地址
来源 | 地址 |
---|---|
豆瓣 | https://pypi.douban.com/simple/ |
阿里云 | https://mirrors.aliyun.com/pypi/simple/ |
清华大学 | https://pypi.tuna.tsinghua.edu.cn/simple/ |
中国科学技术大学 | https://pypi.mirrors.ustc.edu.cn/simple/ |
虚拟环境
这个是个比较使用的东西, 要知道在同一个机器上, 如果只有一个 Python
环境, 一但项目一多, 然后各个项目依赖的包版本还不一样, 那就没法玩了, 所幸 Python
的 虚拟环境
解决了这个问题, 通过隔离不同的环境, 能够使不同项目依赖不同的包版本.
创建虚拟环境
python -m venv {env_path}
路径中的最后一层文件夹将作为虚拟环境名称.
使用虚拟环境
创建虚拟环境之后可以看到在 {env_path}/Scripts/
目录下有一些脚本文件, 通过他们就能切到相应的环境中了:
# Unix/Linux
{env_path}/Scripts/activate
# cmd
{env_path}/Scripts/activate.bat
# PowerShell
{env_path}/Scripts/activate.ps1
注意: 创建了虚拟环境之后不要移动虚拟环境文件夹, 否则会造成虚拟环境不可用(路径找不到).
创建并发布包
这个类似于在 Maven
发布自己的库, 发不出去之后能够被别人下载并依赖, 尝试了一下, 做一下记录.
创建包项目
这个其实没啥不同, 主要是需要一个能够明确代码位置的包名(文件夹), 还需要一个 setup.py
的脚本用来编译包.
注意包下面一定要有 __init__.py
这个文件, 有这个文件存在文件夹才是一个 Python
包.
下面是最基础的一个三方包项目文件展示:
./_6xyun/__init__.py
# coding: utf-8
./_6xyun/tool.py
# coding: utf-8
def version():
return '0.0.1'
./setup.py
# coding: utf-8
from setuptools import setup, find_packages
setup(
name='6xyun',
version='0.0.1',
description='My python package',
# You can just specify the packages manually here if your project is
# simple. Or you can use find_packages().
packages=find_packages(),
install_requires=['requests'],
# List additional groups of dependencies here
extras_require={},
)
可以看到这个三方包存在一个名为 _6xyun
的包, 包下面存在一个 tool
的脚本, 接下来就来发布这个包.
注意: 包不能以数字开头.
本地安装
通过 Python
python setup.py install
这种方式安装会先执行编译过程, 从而生成一堆的临时文件. 安装的产物是
egg
包.
通过 pip
pip install .
这种方式安装不会产生临时文件. 安装的产物是文件夹, 即
egg
包解压后的文件夹.
上传包
首先需要安装 build
和 twine
:
pip install build twine
然后编译项目:
python -m build
最后上传:
python -m twine upload --repository testpypi dist/*
注意这里上传的是
testpypi
仓库, 这是一个用来测试的仓库, 正式环境为pypi
.
使用包
由于上面我们是发布到 https://test.pypi.org/ 这个测试仓库的, 所以安装包的时候也需要加上这个仓库地址:
pip install 6xyun -i https://test.pypi.org/simple/
安装之后就能直接使用了:
from _6xyun import tool
print(tool.version())