Python

包管理

Python导出requirements.txt

1
pipreqs . --encoding=utf8 --force

安装依赖

1
pip install -r requirements.txt

离线安装

1
pip install psutil-5.6.7-cp38-cp38-win_amd64.whl

手动指定安装源

1
2
pip install jieba -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
pip install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host mirrors.aliyun.com

python安装包指定源并添加信任

1
-i http://pypi.douban.com/simple --trusted-host pypi.douban.com

删除依赖

1
pip uninstall requests

安装旧版本包

先去官网https://pypi.org/找到对应的包,然后选择历史版本。

下载whl文件,使用离线安装。

打包应用程序

1
pyinstaller -F -i icon.ico main.py

报错:error: Unable to find vcvarsall.bat

参考知乎

如果你用的是 Anaconda,那么安装下 libpython 就能解决

1
conda install -c anaconda libpython

打包脚本

1
2
3
4
5
6
pyinstaller -F main.py --key ea3FijqE0fUWnn0Hq0Px
del *.c *.spec
rmdir build /Q /S
timeout /nobreak /t 1
cd dist
ren main.exe Annotate_word_files.exe

requests乱码

1
response.encoding = response.apparent_encoding

conda

安装conda

1
2
3
4
5
6
7
https://www.anaconda.com/products/distribution

wget https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh
h
wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh
bash Anaconda3-2022.10-Linux-x86_64.sh
source ~/.bashrc

conda换源

1
2
3
4
5
6
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes

恢复官方源:

1
conda config --remove-key channels

查看安装了哪些包

1
conda list

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

1
2
conda env list 
conda info -e

检查更新当前conda

1
conda update conda

Python创建虚拟环境

1
2
conda create -n m python=3.9
anaconda命令创建python版本为x.x,名字为your_env_name的虚拟环境。your_env_name文件可以在Anaconda安装目录envs文件下找到。

实例

1
conda create -n dhdf python=3.9

导出环境为配置文件

1
conda env export > environment.yaml 

加载配置文件

1
conda env create -f environment.yaml

激活或者切换虚拟环境

打开命令行,输入python –version检查当前 python 版本。

1
2
Linux: source activate your_env_nam
Windows: conda activate your_env_name

切换失败:

若命令行首部不显示当前虚拟环境名称,正常的应形如(base) PS C:\Users\Administrator>

执行命令

1
conda init powershell

关闭后重新打开powershell,若在命令⾏最前⾯出现“(base)”,则成功,可输⼊conda activate envs_name 命令测试。

否则,若出现红⾊如下警告提⽰:

1
⽆法加载⽂件C:\XXX\WindowsPowerShell\profile.ps1,因为在此系统上禁⽌运⾏脚本

执⾏命令:

1
get-ExecutionPolicy

若回复 Restricted,表⽰状态是禁⽌的。

执⾏命令:

1
set-ExecutionPolicy RemoteSigned

将出现如下⼏个选项,输⼊ Y 并回车,设置完毕。

重新打开powershell,即可看到命令⾏开头有“(base)”,输⼊conda activate envs_name 命令即可激活相应的虚拟环境。

关闭虚拟环境(即从当前环境退出返回使用PATH环境中的默认python版本)

1
2
3
deactivate env_name
或者`activate root`切回root环境
Linux下:source deactivate

删除虚拟环境

1
conda remove -n novelai --all -y

实例:

1
conda remove -n exe --all -y

备份和恢复虚拟环境

备份:

1
2
3
4
conda activate mlagents
conda-env export > mlagents.yml
conda deactivate
conda remove -n torch --all -y

恢复:

1
conda env create -f mlagents.yml

Python换源

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

国内源列表:

1
2
3
4
5
6
7
8
9
10
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/

官方:
https://pypi.org/simple/
https://pypi.python.org/pypi

安装对应CUDA版本的pytorch

1
2
3
4
5
6
7
8
9
# 查看CUDA版本
nvcc --version
# 或者
nvidia-smi
#(nvidia-smi -L 显示显卡型号)

pip install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cu117
# 或者
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch-nightly -c nvidia

conda安装库的时候报错

1
2
3
CondaVerificationError: The package for scipy located at /home/lxf/.conda/pkgs/scipy-1.3.1-py37h921218d_1
appears to be corrupted. The path 'lib/python3.7/site-packages/scipy/stats/_continuous_distns.py'
specified in the package manifest cannot be found.

解决:

1
conda clean --packages --tarballs

安装GYM

1
2
3
4
5
pip uninstall gym
pip install gym==0.13
pip install gym[atari]
python -m atari_py.import_roms C:/E/fast_access/Roms
pip install gym[accept-rom-license]

conda清理空间

1
2
3
conda clean -p      //删除没有用的包(推荐)
conda clean -t //tar打包
conda clean -y --all //删除全部的安装包及cache

pip清理:

进入%LocalAppData%\pip\Cache,删除全部内容。

检测Pytorch是否可以连接CUDA

1
2
3
4
5
6
7
8
9
import torch

print('CUDA版本:', torch.version.cuda)
print('Pytorch版本:', torch.__version__)
print('显卡是否可用:', '可用' if (torch.cuda.is_available()) else '不可用')
print('显卡数量:', torch.cuda.device_count())
print('是否支持BF16数字格式:', '支持' if (torch.cuda.is_bf16_supported()) else '不支持')
print('当前显卡型号:', torch.cuda.get_device_name())
print('当前显卡的CUDA算力:', torch.cuda.get_device_capability())

安装ipykernel

1
conda install -n t ipykernel --update-deps --force-reinstall

安装python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
wget http://npm.taobao.org/mirrors/python/3.9.0/Python-3.9.0.tgz
或者https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz
tar -zxvf Python-3.9.0.tgz
cd Python-3.9.0
./configure --with-ssl --prefix=/usr/local/python-3.9.0
make
sudo make install

// 创建软连接
sudo ln -s /usr/local/python-3.9.0/bin/python3 /usr/bin/python39
sudo ln -s /usr/local/python-3.9.0/bin/pip3 /usr/bin/pip39

# 配置环境变量
sudo vim ~/.bash_profile
或者
sudo vim ~/.zsh_profile
# 添加一行:
export PATH=${PATH}:/usr/local/python-3.9.0/bin
# 退出vim,执行以下命令
source ~/.bash_profile

source ~/.zsh_profile
1
sudo rm /usr/bin/python39 //删除软连接

ModuleNotFoundError: No module named ‘_ctypes’的解决方案

安装外部函数库(libffi)

1
yum install libffi-devel -y

重新安装python

问题解决: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not…

查看openssl安装包,发现缺少openssl-devel包

1
2
3
4
[root@localhost ~]# rpm -aq|grep openssl 
openssl-0.9.8e-20.el5
openssl-0.9.8e-20.el5
[root@localhost ~]#

yum安装openssl-devel

1
[root@localhost ~]# yum install openssl-devel -y 

查看安装结果

1
2
3
4
5
[root@localhost ~]# rpm -aq|grep openssl 
openssl-0.9.8e-26.el5_9.1
openssl-0.9.8e-26.el5_9.1
openssl-devel-0.9.8e-26.el5_9.1
openssl-devel-0.9.8e-26.el5_9.1

重新对python进行编译安装

1
sudo cp /usr/lib64/python2.7/lib-dynload/_sqlite3.so /usr/local/python-3.9.8/lib/python3.9/lib-dynload/

知识点

可变长度参数

def func(*p)def func(**p)两种形式,前者可以接收任意多个位置参数并放入元组p中,后者可以接收任意多个关键参数并放入字典p中,元组或字典中元素数量取决于实参的数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def f(*p):
print(p)


def g(**p):
print(p)


f(1, 2, 3)
g(a=1, b=2, c=3)

out:
(1, 2, 3)
{'a': 1, 'b': 2, 'c': 3}

闭包作用域(enclosing scope)

在Python中允许嵌套定义函数,也就是一个函数的定义中可以再定义函数。在内层函数中可以直接使用父函数中局部变量的值,但是如果要在内层函数中修改父函数中局部变量的值,必须使用关键字nonlocal声明该变量绑定到距离最近的父函数中已经存在的局部变量。

星号表达式(star expression)

也属于序列解包的用法,在可迭代对象前面加一个星号表示把其中的元素都取出来,常见于把可迭代对象中的全部元素作为函数的位置参数的场合,例如print(‘abc’)。

1
2
3
4
5
6
7
8
9
10
print(*'abc', sep='-', end='\n', flush=True, file=open('in.txt', 'w'))
def f(*x):
print(x)


f(*'abc')

out:
a-b-c
('a', 'b', 'c')

好用的库

loguru

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from loguru import logger

logger.debug('这是一条debug测试信息')
logger.info('这是一条info测试信息')
logger.warning('这是一条warning测试信息')
logger.error('这是一条error测试信息')

日志输入到文件
from loguru import logger
logger.add('runlog.log'.encoding='utf-8')
logger.debug('这是一条debug测试信息')
logger.info('这是一条info测试信息')
logger.warning('这是一条warning测试信息')
logger.error('这是一条error测试信息')

Python调用C++

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

class TestLib {
public:
void display() { cout << "First display" << endl; }
void display(int a) { cout << "Second display:" << a << endl; }
};
extern "C" {
TestLib obj;
void display() { obj.display(); }
void display_int(int a) { obj.display(a); }
}
1
g++ -o openMPClass.so -shared -fPIC openMPClass.cpp
1
2
3
4
5
6
7
8
import ctypes
dll = ctypes.cdll.LoadLibrary
lib = dll('./libpycallcpp.so')
lib.display()
lib.display_int(0)

ERROR: Could not find a version that satisfies the requirement scikit-image (from torchvideotransforms) (from versions: none)
ERROR: No matching distribution found for scikit-image

错误解决

1
2
3
4
5
6
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
1. Downgrade the protobuf package to 3.20.x or lower.
2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).

More information: https://developers.google.com/protocol-buffers/docs/news/2022-05-06#python-updates

解决方法:

1
2
3
4
5
6
7
8
9
pip uninstall tensorboard -y
pip install tensorboard==1.15
pip install protobuf==3.19.0
pip uninstall pillow -y
pip install pillow

conda uninstall pillow -y
conda install pillow