Python

2019-05-25

Python交互模式REPL

ipython 好

bpython 更好

ptpython 更更好

log

Logbook

版本升级

Ubuntu

1.添加新的源

add-apt-repository ppa:deadsnakes/ppa
apt update

注意,如果出现 Error: retrieving gpg key timed out.

可以更换GPG密钥服务器,你可以用以下命令修改你的GPG配置文件,把密钥服务器改为一个可用的地址,比如keys.openpgp.org:

echo "keyserver keys.openpgp.org" >> ~/.gnupg/gpg.conf

2.卸载原来环境(可以不卸载)

python3.8 -m pip uninstall pip
apt purge --auto-remove python3.8
rm -rf /usr/local/lib/python3.8/dist-packages/

3.安装新版本

apt install python3.10 python3.10-venv python-is-python3

4.用以下命令设置python3.10为默认的python3版本

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2
sudo update-alternatives --config python3

5.安装pip

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

PIP

更新pip自身

python -m pip install --upgrade pip

查看需升级的包

pip list --outdated

更新源

pip使用国内源

pip国内镜像:

中国科技大学     https://pypi.mirrors.ustc.edu.cn/simple/
阿里云           https://mirrors.aliyun.com/pypi/simple/
豆瓣             https://pypi.douban.com/simple/
清华大学         https://pypi.tuna.tsinghua.edu.cn/simple/

Linux的文件在 ~/.config/pip/pip.conf ~/.pip/pip.conf

Windows在 %HOMEPATH%\pip\pip.ini

注意配置文件有优先级顺序!

在你的机器上可能存在以下几个配置文件,它们按照优先级排序:
[优先级1] 站点级别的配置文件,例如/usr/pip.conf
[优先级2] 用户级别的配置文件,例如/root/.config/pip/pip.conf或/root/.pip/pip.conf
[优先级3] 全局级别的配置文件,例如/etc/pip.conf或/etc/xdg/pip/pip.conf
当多个配置文件存在时,PIP会按照优先级合并它们,高优先级的文件会覆盖低优先级的文件中的设置。
[global]
index-url=https://pypi.mirrors.ustc.edu.cn/simple
[install]
trusted-host=pypi.mirrors.ustc.edu.cn

如果遇到ssl报错,那么换阿里云的http源

[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com

使用多个源(备用):

[global]
timeout=40
index-url = https://pypi.mirrors.ustc.edu.cn/simple
extra-index-url = https://mirrors.aliyun.com/pypi/simple
# 取消pip版本检查,排除每次都报最新的pip
disable-pip-version-check = false
[install]
trusted-host=
    pypi.mirrors.ustc.edu.cn/simple
    mirrors.aliyun.com

参数

# pip --help

Usage:
  pip <command> [options]

Commands:
  install                     安装软件.
  uninstall                   卸载软件.
  freeze                      按着一定格式输出已安装软件列表
  list                        列出已安装软件.
  show                        显示软件详细信息.
  search                      搜索软件,类似yum里的search. -> 新版不支持,可用pip-search替代:pip install pip-search ,用法:pip_search [包名]
  wheel                       Build wheels from your requirements.
  zip                         不推荐. Zip individual packages.
  unzip                       不推荐. Unzip individual packages.
  bundle                      不推荐. Create pybundles.
  help                        当前帮助.

General Options:
  -h, --help                  显示帮助.
  -v, --verbose               更多的输出,最多可以使用3次
  -V, --version               现实版本信息然后退出.
  -q, --quiet                 最少的输出.
  --log-file <path>           覆盖的方式记录verbose错误日志,默认文件:/root/.pip/pip.log
  --log <path>                不覆盖记录verbose输出的日志.
  --proxy <proxy>             Specify a proxy in the form [user:passwd@]proxy.server:port.
  --timeout <sec>             连接超时时间 (默认15秒).
  --exists-action <action>    Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup.
  --cert <path>               证书.

其他

Python输出缓冲区

python输出缓冲区要满 4k 才写入文件,除非禁用缓存或者强制输出或者程序结束

解决的办法:

1.运行时加-u参数,如 `# python -u test.py` 

2.在不要缓冲的每一次print后面添加sys.stdout.flush()函数

3.添加环境变量 `PYTHONUNBUFFERED=1`

`

用Python代码段检查当前环境 OpenSSL 支持的版本,通过requests模块

python -c "import requests; print(requests.get('https://www.howsmyssl.com/a/check', verify=False).json()['tls_version'])"

BAT脚本直接启动Anaconda python环境

start "" cmd /k "C:\ProgramData\Anaconda3\Scripts\activate py36"

Anaconda conda

Anaconda下载地址:

https://www.anaconda.com/products/individual#Downloads

历史版本下载地址:https://repo.anaconda.com/

将Anaconda设为默认的python环境

将以下路径加入到path环境变量

C:\ProgramData\Anaconda3
C:\ProgramData\Anaconda3\Scripts
C:\ProgramData\Anaconda3\Library\bin

如果你想加入的环境不是你的Anaconda的Base环境而是自己的环境的话,只需要进入anaconda3文件夹下面的envs文件夹中找到你自己所创建的环境,然后添加对应文件夹中的这3个路径就行。

Miniconda下载地址:

https://conda.io/miniconda.html

wget https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh
bash Miniconda2-latest-Linux-x86_64.sh

scipy安装(指定清华源):

conda install -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r scipy

修改conda为国内源:

(1)清华源(TUNA)

conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/win-64/
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/win-64/
conda config --set show_channel_urls yes
conda config --set ssl_verify no

(2)中科大源(USTC)

conda config --add channels http://mirrors.ustc.edu.cn/anaconda/pkgs/free/win-64/
conda config --add channels http://mirrors.ustc.edu.cn/anaconda/pkgs/main/win-64/
conda config --set show_channel_urls yes
conda config --set ssl_verify no

(3)阿里云源(ALIYUN) (注意:Windows环境后面路径加上 /win-64/ !!!)

conda config --add channels http://mirrors.aliyun.com/anaconda/pkgs/free/win-64/
conda config --add channels http://mirrors.aliyun.com/anaconda/pkgs/main/win-64/
conda config --set show_channel_urls yes
conda config --set ssl_verify no

也可以直接编辑文件:进入用户目录,比如 ”C:\Users\Administrator“,打开“.condarc“,填入以下文件保存。

ssl_verify: false
show_channel_urls: true

channels:
  - http://mirrors.aliyun.com/anaconda/pkgs/free/win-64/
  - http://mirrors.aliyun.com/anaconda/pkgs/main/win-64/

命令说明:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 添加通道
conda config --set show_channel_urls yes    # 执行安装包时会显示来自哪个源
conda config --remove-key channels          # 删除通道
conda config --show channels                # 显示通道
conda config --set ssl_verify no            # 不验证https

创建新环境

Windows下使用管理员启动cmd

conda create -n py37 python=3.7

激活环境

conda activate py37

取消默认激活环境

conda config --set auto_activate_base false

vscode中取消默认激活环境

设置 - 搜索:python - 找到 activateEnvironment 取消勾选

“python.terminal.activateEnvironment”: false

vscode中 Python 清除工作区解释器设置

ctrl + shift + p

输入:python clear work 后点选

查看当前存在哪些虚拟环境

conda env list 或 conda info -e

使用激活(或切换不同python版本)虚拟环境

Linux:  source activate your_env_name
Windows: activate your_env_name

conda pip使用国内源

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

对虚拟环境中安装额外的包

conda install -n your_env_name [package]

关闭虚拟环境

Linux: source deactivate
Windows: deactivate

删除虚拟环境

conda remove -n your_env_name --all
conda remove --name your_env_name package_name

直接安装:

conda install numpy
conda install scikit-learn

神经网络依赖包:

conda install numpy
conda install pandas
conda install scipy

查看安装列表:

conda list
# packages in environment at /root/miniconda2:
#
cffi                      1.9.1                    py27_0  
conda                     4.3.13                   py27_0  
conda-env                 2.6.0                         0  
cryptography              1.7.1                    py27_0  
enum34                    1.1.6                    py27_0  
idna                      2.2                      py27_0  
ipaddress                 1.0.18                   py27_0  
libffi                    3.2.1                         1  
libgfortran               3.0.0                         1  
mkl                       2017.0.1                      0  
numpy                     1.12.0                   py27_0  
openssl                   1.0.2k                        0  
pip                       9.0.1                    py27_1  
pyasn1                    0.1.9                    py27_0  
pycosat                   0.6.1                    py27_1  
pycparser                 2.17                     py27_0  
pyopenssl                 16.2.0                   py27_0  
python                    2.7.13                        0  
readline                  6.2                           2  
requests                  2.12.4                   py27_0  
ruamel_yaml               0.11.14                  py27_1  
scikit-learn              0.18.1                    <pip>
scipy                     0.18.1              np112py27_1  
setuptools                27.2.0                   py27_0  
six                       1.10.0                   py27_0  
sklearn                   0.0                       <pip>
sqlite                    3.13.0                        0  
tk                        8.5.18                        0  
wheel                     0.29.0                   py27_0  
yaml                      0.1.6                         0  
zlib                      1.2.8                         3  

Jupyter

Jupyter Notebook使用指定的conda环境

conda install nb_conda

重新启动jupyter notebook之后,就可以在kernel中选择自己需要的虚拟环境

Jupyter切换主题

首先在windows下打开anaconda自带的Anaconda Prompt命令行工具,使用最基本简便的pip安装即可

pip install jupyterthemes #安装jupyterthemes
pip install --upgrade jupyterthemes #更新到最新版本的jupyterthemes
jt -l #查看可用的jupytertheme主题

使用-t选项选择主题,使用-f选项设置字体,使用-fs选项设置字体大小,使用-T命令使工具条可见,使用-N使Name和logo可见

jt -t chesterish -f roboto -fs 12 -T -N

Jupyter notebook 离线查看工具

使用nbpreview可以直接查看 ipynb 结尾的文件,不用联网启动 Jupyter notebook了,甚至连 Jupyter 和 IPython 都不用安装就可以能直接查看:Demo

项目地址:https://github.com/jsvine/nbpreview

其他技巧

git bash中使用python

编辑文件:C:\Program Files\Git\etc\profile.d\aliases.sh

将13行:

    for name in node ipython php php5 psql python2.7

里的python2.7改成pyhton

这样git bash里输入python就能正常进入环境了

关闭*.pyc文件生成

import 别的 py 文件时,那个 py 文件会被存一份 pyc 加速下次装载。

但是测试时为了不影响目录结构可以关闭:

import sys
sys.dont_write_bytecode = True

py文件打包编译成可执行文件

windows下编译成exe

1.使用py2exe

建立setup.py

from distutils.core import setup
import py2exe
setup(console=['app.py'])

执行

python setup.py py2exe

2.使用pyinstaller

执行

pyinstaller --distpath .\dist_pyinstaller --workpath .\build_pyinstaller -F app.py -n out.exe

Linux下编译成可执行文件

1.pyinstaller支持linux下编译打包,使用方法和windows下一致

pyinstaller --distpath ./dist_pyinstaller --workpath ./build_pyinstaller -F app.py -n out

Python二维码识别库

apt-get install python-qrtools

使用方法:

#!/usr/bin/env python
import qrtools
qr = qrtools.QR()
qr.decode("qr.png")
print qr.data

python有序字典

import collections
d = collections.OrderedDict()
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'

Python Web开发

Python异步(ASGI)网络框架基准测试: http://klen.github.io/py-frameworks-bench/

用Python建立最简单的web服务器

python2:

python -m SimpleHTTPServer 8080

python3:

python -m http.server 8080

sanic简单高性能异步框架

Sanic 是一个Python 3.7+的Web 服务器和 Web 框架,其编写速度快。

https://sanic.dev/zh/

Tornado+Flask 建立Web服务器

app.py

import subprocess
from flask import Flask,request

app = Flask(__name__)
app.debug = True
log = app.logger.debug
app.logger.propagate = 0  # 防止日志向上传播 https://segmentfault.com/q/1010000004077355

@app.route('/')
def hello():
    return 'Hello world!'

@app.route('/cmd',methods=['GET'])
def cmd():
    postdata = request.args.get('data', '')
    log(postdata)
    cmd = str(postdata)
    val = subprocess.getoutput(cmd)
    return val

tornado_server.py

from tornado.httpserver import HTTPServer
from tornado.wsgi import WSGIContainer
from app import app
from tornado.ioloop import IOLoop

if __name__ == '__main__':
    s = HTTPServer(WSGIContainer(app))
    s.listen(8001) # 监听端口
    IOLoop.current().start()

用PHP建立最简单的web服务器

Example #1 启动Web服务器  服务于当前目录
$ php -S localhost:8000

Example #2 启动时指定根目录
$ php -S localhost:8000 -t malu/

Example #3 使用路由(Router)脚本
$ php -S localhost:8000 router.php

错误

导入matplotlib.pyplot模块时报错:

from . import _imaging as core
ImportError: DLL load failed: 找不到指定的模块。

解决办法,把 Pillow、matplotlib更新到最新:

pip uninstall matplotlib
pip uninstall Pillow
pip install Pillow
pip install matplotlib

pip list 显示错误异常:

[ root@0d4c1b027902:~ ]$ pip list
argparse (1.2.1)
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/list.py", line 80, in run
    self.run_listing(options)
  File "/usr/lib/python2.7/dist-packages/pip/commands/list.py", line 142, in run_listing
    self.output_package_listing(installed_packages)
  File "/usr/lib/python2.7/dist-packages/pip/commands/list.py", line 151, in output_package_listing
    if dist_is_editable(dist):
  File "/usr/lib/python2.7/dist-packages/pip/util.py", line 366, in dist_is_editable
    req = FrozenRequirement.from_dist(dist, [])
  File "/usr/lib/python2.7/dist-packages/pip/__init__.py", line 286, in from_dist
    assert len(specs) == 1 and specs[0][0] == '=='
AssertionError

Storing debug log for failure in /root/.pip/pip.log

解决办法:

  • to remove ubuntu package: sudo apt-get remove –auto-remove python-pip
  • download official pip installer: wget https://bootstrap.pypa.io/get-pip.py
  • install pip by running downloaded installer: sudo python get-pip.py
  • add sym-link to make it run without full path: sudo ln -s /usr/local/bin/pip /usr/bin/pip

Done!

中文乱码问题3条建议

  • 所有 text string 都应该是 unicode 类型,而不是 str,如果你在操作 text,而类型却是 str,那就是在制造 bug。
  • 在需要转换的时候,显式转换。从字节解码成文本,用 var.decode(encoding),从文本编码成字节,用 var.encode(encoding)。
  • 从外部读取数据时,默认它是字节,然后 decode 成需要的文本;同样的,当需要向外部发送文本时,encode 成字节再发送。

常用Python包

1、pip freeze > requirements.txt 将当前环境中的包的名称及版本导出到文本中

2、然后在另一个环境中 pip install -r requirements.txt 安装

Python3常用包安装:

apt-get install -y libcurl4-openssl-dev libsmbclient-dev python-pip python3-pip

pip3 install pysimplesoap

pip3 install -r requirements.txt

[ root@base:~ ]$ cat requirements.txt 
altgraph==0.15
asn1crypto==0.24.0
beautifulsoup4==4.6.0
binwalk==2.1.0
bs4==0.0.1
cached-property==1.4.2
certifi==2018.1.18
chardet==2.3.0
configparser==3.5.0
crcelk==1.1
cryptography==2.1.4
cssselect==1.0.1
cycler==0.10.0
Cython==0.26.1
decorator==4.0.11
docker-pycreds==0.3.0
dockerpty==0.4.1
docopt==0.6.2
future==0.16.0
hashID==3.1.4
html5lib==0.999999999
httplib2==0.9.2
idna==2.6
inflect==0.2.5
jaraco.itertools==2.1
jsonschema==2.6.0
keyring==10.6.0
keyrings.alt==3.0
louis==1.3
lxml==4.1.1
macholib==1.9
matplotlib==2.0.0
more-itertools==4.0.1
numpy==1.12.1
olefile==0.45.1
pefile==2017.11.5
Pillow==4.0.0
pyasn1==0.1.9
pycrypto==2.6.1
pycurl==7.43.0
pygobject==3.26.1
PyInstaller==3.3.1
pymongo==3.1.1
PyOpenGL==3.1.0
pyparsing==2.1.10
pyqtgraph==0.10.0
pyquery==1.3.0
pyserial==3.2.1
PySimpleSOAP==1.16.2
pysmbc==1.0.15.6
python-dateutil==2.5.3
python-debian==0.1.30
python-debianbts==2.6.1
pytz==2016.7
pyxdg==0.25
PyYAML==3.12
requests==2.12.4
scipy==0.18.1
SecretStorage==2.3.1
selenium==3.7.0
six==1.10.0
smoke-zephyr==1.0.2
ssh-import-id==5.7
termineter==0.2.6
texttable==0.9.1
urllib3==1.19.1
webencodings==0.5
websocket-client==0.48.0
xmltodict==0.11.0

mysql-python安装过程

快速安装

apt-get update
apt-get install -y libffi-dev python-dev
apt-get install -y libmysqlclient-dev
apt-get install -y libmysqld-dev
pip install mysql-python

导入模块:

>>> import MySQLdb

在Windows下安装 MySQL-python 1.2.5

安装步骤如下:

1.安装 Microsoft Visual C++ Compiler Package for Python 2.7 下载链接

2.安装 MySQL Connector C 6.0.2 下载链接

3.下载 MySQL-python 1.2.5 源码包 下载链接

4.解压源码包后,修改 site.cfg 文件。

实际上,如果你是在32 位系统上部署,那么通过pip install 安装MySQL-python 1.2.5 只需进行上面的依赖包安装即可。 但在 64 位环境中,就会提示“Cannot open include file: ‘config-win.h’” 的错误。 原因就是 site.cfg 中写的 MySQL Connector C 为32 位版本。

原来的 site.cfg 文件内容如下:

# http://stackoverflow.com/questions/1972259/mysql-python-install-problem-using-virtualenv-windows-pip
# Windows connector libs for MySQL. You need a 32-bit connector for your 32-bit Python build.
connector = C:\Program Files (x86)\MySQL\MySQL Connector C 6.0.2

修改为:

connector = C:\Program Files\MySQL\MySQL Connector C 6.0.2

5.运行 python setup.py install 即可安装完成。

不想那么麻烦可以直接安装这个 MySQL-python-1.2.3.win-amd64-py2.7.exe

参考:http://www.codegood.com/archives/129

python_gevent模块安装

通过pip安装,先确保python-dev和libevent-dev已安装:

apt-get install python-dev
apt-get install libevent-dev 
pip install gevent

正常情况greenlet也会一同安装:

gevent (1.1.1)
greenlet (0.4.9)

如果遇到安装不上的情况,可以尝试安装旧版本:

pip install gevent==0.13.8

当然也可以下载源码安装:

wget http://pypi.python.org/packages/source/g/gevent/gevent-0.13.8.tar.gz

解压后,要先运行下其中的:

python fetch_libevent.py

然后:

python setup.py build
python setup.py install