0%

入门 Python 二三事

这几天为了搞个微信机器人, 在 Node.jsPython 之中纠结来纠结去, 最终由于 Node.js 复杂的依赖处理放弃了, 选择了 Python, 花了些时间搞了几天, 突然发现当初因为感觉 Python 是门胶水语言而对它嗤之以鼻, 现在真是追悔莫及.

讲道理, Python 确实香, 平时想搞个小工具, 一直都是轻量的 shell 重量的 java/kotlin, kotlin 虽好但架不住需要专门安装运行时环境, 并且 jvm 内存消耗大, 自己的羊毛服务器稍微跑几个 jvm 内存就所剩无几, 直到这几天用 Python 搞出来了这个微信机器人, 才发现这不是就是我一直在找的东西吗?

  • 简单上手快
  • 消耗内存小
  • 能写带界面的程序
  • 支持编译为可执行文件
  • Node.js 比较安装依赖简洁且包体积小

综上所述, 简直是用来作为一个工具语言的首选!

好了, 切入正题, 开个文章来记录一下 Python 使用上的一些常用但容易忘的内容.

安装

安装这个很简单, Windows 下直接下载安装包, Linux 下通过包管理器直接安装, 基本都可以直接安装上.

https://www.python.org/downloads/

配置 pip 加速

pipPython 的包管理器, 效果类似 Debianapt, CentOSyum.

通过 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

注意: 创建了虚拟环境之后不要移动虚拟环境文件夹, 否则会造成虚拟环境不可用(路径找不到).

依赖

导出依赖

pip freeze > requirements.txt

安装依赖

pip install -r requirements.txt

创建并发布包

这个类似于在 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 包解压后的文件夹.

上传包

首先需要安装 buildtwine:

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())

打包为二进制

安装打包器:

pip install pyinstaller

打包为单文件:

pyinstaller --onefile main.py

main.py 为实际的入口文件.

引用