Python包管理与编辑器

通常Python入门,很多情况都是直接在IDLE上敲代码,但是这个IDLE又没有补全,又没有赏心悦目的界面,这就很郁闷了….

于是,对于编辑器,这就好好选择了。

安装Anaconda

这是Python的一个包管理器,通过它,你可以十分轻松地对Python的包进行管理(安装与卸载)。(这包就是Python的生命呀,还不好好地弄好)

因为Python有2和3,相互又有点不兼容,所以Anaconda也有对应Python2和Python3的版本。地址在这里

在装完Anaconda时,同时它会自动帮你装上Python,所以之前如果有单独装过Python的,就可以卸掉了。

Anaconda环境变量

此电脑->右键选择属性->高级系统设置->环境变量->系统变量->path添加anaconda的安装路径。即可在任意终端中打开python

出现“conda 不是内部命令”的情况,则需要将anaconda安装目录下的Scripts也加入到系统变量中,步骤同上,就可以解决

安装PyCharm

PyCharm是一个十分优秀的Python编辑器,虽然它的包比较大,运行的时候较为占用资源。但是它在编码以及调试的时候能提高不少效率。因为PyCharm只是编辑器,所以也就没有版本之分了。

http://www.jetbrains.com/pycharm/download/#section=windows
Community版免费,已经足够使用了(良心企业)。

一开始使用PyCharm可能挺难上手,但是用惯了以后则会慢慢享受起来了~

使用Anaconda安装Python的包(模块)

在windows的搜索中(开始键+s,还有各种搜索方法),可以找到这个

点开以后,会有如下界面(有些高级点的Anaconda Navigator 有交互界面,,,那个另说啦)

以最常见的numpy包为例,只要输入

1
conda install numpy

或者

1
pip install numpy

就能安装(推荐使用pip安装,还有忘了pip要不要事先安装了- -)

因为很多时候安装的包从国外下载,就会特别慢,所以换成国内的镜像(国外资源在国内的复制品的感觉吧),速度就嗖嗖嗖的

于是在命令改为

1
2
pip install numpy -i https://pypi.douban.com/simple
-i 后面的参数是更换的镜像源的地址,使用豆瓣的源

至此,如无意外,就能好好装包了,import ~~~

pip 换源

但是每次都加参数,很是不方便,可以修改配置文件使得永久生效。

windows:
在资源管理器的地址栏输入%appdata%后回车,新建一个pip文件夹,新建文件pip.ini,内容如下:

1
2
3
[global]
timeout = 60000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

Linux:
修改 ~/.pip/pip.conf (没有就创建一个), 内容如下:

1
2
3
[global]
timeout = 60000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

使用PyCharm

建立工程

Location:工程放到哪里
Interpreter:解析器,选择Anaconda的,不然刚装的包没有用

新建Python文件

对左方文件夹右键,如图 然后键入文件名就好

敲代码

这不用说了吧?

运行代码

敲完代码以后,直接在代码框上右键找到run

或者右上角有个三角形的进行运行,不过甚是麻烦那个,就不说了。

运行结果在下面的框框中。

别的东西

下方栏中的几个工具:

跟原生IDLE差不多,具有交互功能(另外有个IPython的,具有补全功能的交互式IDLE)

然后这个

终端,,没什么好解释的,就是系统的那个黑色框框

如果程序需要外部运行时传入参数,用这个可以帮到你。

然后敲代码的时候,多按照PyCharm提示,调整自己的代码风格,我觉得是挺好的。

启用Gevent compatible debugging

最新版本的Pycharm中,若调试的过程中出现了unable to display frame variables,则在Settings->Python Debugger->Gevent compatible 前面打上勾。

java.net.BindException: Address already in use: bind

Pycharm打开的时候,遇到错误java.net.BindException: Address already in use: bind,此时执行如下指令即可:

1
2
net stop winnat
net start winnat

Anaconda Navigator

具有交互式界面的Anaconda包管理器

在Home界面,

这个可以打开ipynb文件,一种可以改动的交互式笔记本,常用作教学使用(好吧,我编不下去了,自己百度吧,,,)

IPython,之前提过,Python原生交互式Shell的增强版,在平时试语法试函数等等常用,带自动补全。

跟Matlab特别想像的Python编辑器,可以查看变量之类的。(爬虫挺适合的吧)
在Environments可以浏览一堆Python包,选择安装。

其余就不细说了~~

Pyc文件反编译

最近想借鉴一下师兄的代码,但是苦于师兄只给了pyc文件,但是没有给py文件。在网上找到了可以通过pyc文件反编译出py文件的方法。自己试了试,感觉特别管用,所以在这里记录一下。

首先,安装uncompyle

1
pip install uncompyle

然后,我使用pip在mac os或者Ubuntu上安装好后的可执行文件名叫uncompyle6,很奇葩有没有

1
2
3
uncompyle6 --help 查看帮助
uncompyle6 models.pyc > models.py 将models.pyc反编译成py文件
uncompile -o . *.pyc 将当前文件夹中所有的pyc文件反编译成后缀名为.pyc_dis的源文件

反编译后的效果可以说很理想,如果你的代码格式符合PEP8规范的要求,那就基本和源来的文件一样,不过各种注释就没有了(不能要求太高是不是)。即使不符合PEP8规范,反编译的结果也很好。

解决pip报错

有的时候pip环境会严重错乱,出现了错误AttributeError: '_NamespacePath' object has no attribute 'sort'或者 ModuleNotFoundError: No module named 'pip._internal',网上有很多种解决该错误的方法,但是下面这种方法最有效。

1
2
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py --force-reinstall

硬盘空间不足

当硬盘空间不足时,使用pip安装包时,会出现ERROR: Could not install packages due to an EnvironmentError: [Errno 28] No space left on device的错误,解决方法为:

1
TMPDIR=/data2/zhaodali/tmp pip install torch==1.1.0 torchvision==0.3.0  --cache-dir=/data2/zhaodali/tmp --build /data2/zhaodali/tmp

终端调试

使用ipdb调试,例如要调试的Python文件名为test.py,则运行下面语句即可开始调试。

1
python -m ipdb test.py

具体调试的常用命令可以查看相关手册,这里不再列出来。

需要注意的是,当文件中有中文时,调试时可能出现UnicodeEncodeError: 'ascii' codec can't encode characters in position 343-351: ordinal not in range(128)这样的错误,解决方法为,在~/.bash_profile文件中,添加一行:

1
export LANG="en_US.UTF-8"

保存退出后重新打开命令行控制台。

如果上面的方法不管用,则在终端中输入export PYTHONIOENCODING=utf-8即可。

查看包依赖

1
2
3
4
5
6
7
8
9
10
11
(base) [zhaodali@zdaopt ~]$ pip show tensorflow-gpu
Name: tensorflow-gpu
Version: 1.14.0
Summary: TensorFlow is an open source machine learning framework for everyone.
Home-page: https://www.tensorflow.org/
Author: Google Inc.
Author-email: packages@tensorflow.org
License: Apache 2.0
Location: /data4/zhaodali/anaconda36/lib/python3.6/site-packages
Requires: keras-applications, numpy, grpcio, six, protobuf, google-pasta, keras-preprocessing, tensorboard, termcolor, absl-py, tensorflow-estimator, gast, wrapt, wheel, astor
Required-by:

查看包的位置

要想查看包的安装路径,可以执行(以pygaggle包为例):

1
python -c "import pygaggle;print(pygaggle.__file__)

setup.py设置环境变量

当使用python setup.py install安装https://github.com/NVIDIA/retinanet-examples,提示找不到tensorrt库,在`setup.py`文件中的`ext_modules`中添加这样的一句话:`extra_link_args=['-L/data2/zhaodali/software/TensorRT-6.0.1.8/lib'],`即可。

IPdb调试

使用ipdb调试,若想要输入多行语句,则直接输入interact即可。完成后,使用Ctrl-D返回常规pdb提示符。只是不要按Ctrl-C,那样会终止整个pdb会话。

Python知识图谱

Python知识图谱

sys.path与LD_LIBRARY_PATH

sys.path is only searched for Python modules. For dynamic linked libraries, the paths searched must be in LD_LIBRARY_PATH.

若想若Python脚本中打印LD_LIBRARY_PATH,则执行os.environ['LD_LIBRARY_PATH']

跨文件调用

比如文件夹结构为

1
2
3
4
├── patch
│ ├── patch_gen.py
├── tools
│ ├── train.py

train.py想调用patch_gen.py中的函数。

方法一:需要在sys.path中添加patch文件夹路径,但是添加的相对路径以当前工作目录下的相对路径为准

  1. 若在当前根目录下执行python tools/train.py,此时需要在train.py中添加
1
2
3
import sys
sys.path.append(os.path.abspath("./patch/"))
from patch_gen import *
  1. 若在tools目录下执行python train.py,此时需要在train.py中添加
1
2
3
import sys
sys.path.append(os.path.abspath("../patch/"))
from patch_gen import *

方法二:在执行文件时,添加环境变量PYTHONPATH=./ python tools/train.py,此时需要在train.py中添加

1
from tools.patch_gen import *

查看当前搜索路径以及工作路径为print(sys.path, os.getcwd())

调试路径

当我们使用python -m ipdb 文件调试Python文件时,会在模块搜索路径中添加''路径,可能导致调试时加载的包和直接python 文件调用不同。例如:

Python3.6下,tools/rain_net.py文件会加载maskrcnn_benchmark模块,在../tools根目录下,有maskrcnn_benchmark文件夹;maskrcnn_benchmark已经安装在/miniconda/envs/py36/lib/python3.6/site-packages中。

  1. 若执行python tools/rain_net.py,则会加载/miniconda/envs/py36/lib/python3.6/site-packages/maskrcnn_benchmark-0.1-py3.6-linux-x86_64.egg/maskrcnn_benchmark/;此时打印sys.path,则输出为

    img

  2. 若执行python -m ipdb,则会加载../tools根目录下的maskrcnn_benchmark文件夹;此时打印sys.path,则输出为

    img

对比这两个图,可以发现多了路径'',导致调试情况下与正常情况下调用路径不同。

CXXABI_1.3.9

Python运行时报错 ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9’ not found (required by /root/anaconda3/lib/python3.8/site-packages/matplotlib/ft2font.cpython-38-x86_64-linux-gnu.so)。

  1. 查看系统中的libstdc++.so.6版本
1
strings /usr/lib64/libstdc++.so.6 | grep CXXABI

image-20220419144659741

可以看到系统中CXXABI的版本最高到1.3.7,未达到1.3.9。

  1. 查看conda或者anaconda中的libstdc++.so.6版本
1
2
strings /root/anaconda3/lib/libstdc++.so.6.0.26 | grep 'CXXABI'
# 路径改为你自己的conda或者anaconda的路径

image-20220419144752435

  1. 将conda中的libstdc++.so.6复制到系统中
1
cp /root/anaconda3/lib/libstdc++.so.6.0.26 /usr/lib64/libstdc++.so.6
  1. 检查系统中libstdc++.so.6的版本是否更新

image-20220419144915671

补充一个Centos 7 中高版本 libstdc++.so.6下载地址:https://www.vuln.cn/9154。

1
2
3
4
5
6
7
8
9
10
11
> # 将下载的包放到 /usr/lib64 下
> [root@83955d05 roach]# cp libstdc++.so.6.0.26 /usr/lib64/
> # 到 /usr/lib64 目录下
> [root@83955d05 roach]# cd /usr/lib64/
> # 删除
> [root@83955d05 lib64]# rm -rf libstdc++.so.6
> # 重新链接
> [root@83955d05 lib64]# ln -s libstdc++.so.6.0.26 libstdc++.so.6
> # 查询升级后是否是我们想要的
> [root@83955d05 lib64]# strings libstdc++.so.6 | grep GLIBCXX
>

pip install -e

1
2
-e,--editable <path/url>
Install a project in editable mode (i.e. setuptools "develop mode") from a local project path or a VCS url.

举个例子,

1
2
3
4
cd /mnt/private_zhaodali_cq/backdoor/BackdoorExplore/transmart/
git clone https://github.com/pytorch/fairseq && \
cd fairseq && \
pip3 install --editable ./

安装完毕之后,

1
2
3
4
5
6
7
8
9
10
11
root@VM-172-194-centos:~# pip show fairseq
Name: fairseq
Version: 1.0.0a0+6d7aace
Summary: Facebook AI Research Sequence-to-Sequence Toolkit
Home-page: https://github.com/pytorch/fairseq
Author: None
Author-email: None
License: UNKNOWN
Location: /mnt/private_zhaodali_cq/backdoor/BackdoorExplore/transmart/fairseq
Requires: cffi, cython, hydra-core, omegaconf, regex, sacrebleu, torch, tqdm, bitarray, torchaudio, numpy
Required-by:

也就是说,此时包的安装路径是/mnt/private_zhaodali_cq/backdoor/BackdoorExplore/transmart/fairseq

我们进入pip默认的安装路径/root/anaconda3/lib/python3.8/site-packages看看什么情况:

1
2
3
4
5
6
7
8
9
10
root@VM-172-194-centos:~# cd /root/anaconda3/lib/python3.8/site-packages
root@VM-172-194-centos:site-packages# ls -al |grep fair
drwxr-xr-x 8 root root 4096 Oct 15 2021 fairscale
drwxr-xr-x 2 root root 4096 Oct 15 2021 fairscale-0.4.0.dist-info
-rw-r--r-- 1 root root 69 Apr 30 20:37 fairseq.egg-link
root@VM-172-194-centos:site-packages# cd /root/anaconda3/lib/python3.8/site-packages
root@VM-172-194-centos:site-packages# ls -al |grep fairseq
-rw-r--r-- 1 root root 69 Apr 30 20:37 fairseq.egg-link
root@VM-172-194-centos:site-packages# cat fairseq.egg-link
/mnt/private_zhaodali_cq/backdoor/BackdoorExplore/transmart/fairseq

也就是说,通过pip install -e安装的包fairseq,会在site-packages中建立一个链接,链接到fairseq工程所在的位置。这样做的好处就是当我们修改fairseq库中的代码时,是实时生效的(需要从C、C++等编译到Py文件的除外)。

如何查看pip对应的版本

有的时候会遇到在直接敲python进入python3.9,但是pip或者pip3安装包都会安装到python3.8的情况,遇到这种情况,我们需要查看pip对应的python版本。

1
2
3
pip -V
# 输出结果
pip 22.1.1 from /home/zhaodali/.local/lib/python3.8/site-packages/pip (python 3.8)

可以看出来这个pip其实是python3.8的pip。

那么怎么才能使用python3.9的pip呢?假设python3.9对应的虚拟环境叫做test,那么先使用conda info -e得到test环境对应的路径是/home/zhaodali/.conda/envs/test,那么使用/home/zhaodali/.conda/envs/test/bin/pip就是python3.9的pip了。若想直接输入pip就是python3.9的pip,需要配置对应的环境。

PEP

PEP的全称是Python Enhancement Proposals,其中Enhancement是增强改进的意思,Proposals则可译为提案或建议书,所以合起来,比较常见的翻译是Python增强提案Python改进建议书

Python核心开发者主要通过邮件列表讨论问题、提议、计划等,PEP通常是汇总了多方信息,经过了部分核心开发者review和认可,最终形成的正式文档,起到了对外公示的作用,所以翻译成“提案”更恰当。

PEP的官网是:https://www.python.org/dev/peps/,这也就是PEP 0 的地址。其它PEP的地址是将编号拼接在后面,例如:https://www.python.org/dev/peps/pep-0020/ 就是PEP 20 的链接,以此类推。

软件包归档格式

Python的软件包一开始是没有官方的标准分发格式的。比如Java有jar包或者war包作为分发格式,Python则什么都没有。 后来不同的工具都开始引入一些比较通用的归档格式。比如,setuptools引入了Egg格式。 但是,这些都不是官方支持的,存在元数据和包结构彼此不兼容的问题。因此,为了解决这个问题, PEP 427定义了新的分发包标准,名为Wheel。目前pip和setuptools工具都支持Wheel格式。 这里我们简单总结一下常用的分发格式:

  • tar.gz格式:这个就是标准压缩格式,里面包含了项目元数据和代码,可以使用Python setup.py sdist命令生成。
  • egg格式:这个本质上也是一个压缩文件,只是扩展名换了,里面也包含了项目元数据以及源代码。这个格式由setuptools项目引入。 可以通过命令Python setup.py bdist_egg命令生成。
  • whl格式:这个是Wheel包,也是一个压缩文件,只是扩展名换了,里面也包含了项目元数据和代码,还支持免安装直接运行。 whl分发包内的元数据和egg包是有些不同的。这个格式是由PEP 427引入的。可以通过命令Python setup.py bdist_wheel生成。

Wheel is a distribution format, i.e a packaging format. 1 Egg was both a distribution format and a runtime installation format (if left zipped), and was designed to be importable. 也就是说,Python可以直接从egg中导入包。

比如执行python -c "import pygaggle;print(pygaggle.__file__),得到它的路径为'/data/xxx/.conda/envs/zd39/lib/python3.9/site-packages/pygaggle-0.0.3.1-py3.9.egg/pygaggle/__init__.py'。但其实/data/xxx/.conda/envs/zd39/lib/python3.9/site-packages/pygaggle-0.0.3.1-py3.9.egg/是一个文件,不是文件夹。

Python Wheels网站展示了使用Wheels发行的python模块在PyPI上的占有率,推荐使用wheel包。’

如果你到系统中安装Python库的路径下看看,就能看到很多名称以.egg-info或者以.dist-info结尾的目录。这些目录的内容就是这个库的元数据(It stores data about your package, like its name, version, and dependencies), 是从库的分发包中拷贝出来的。其中.egg-info类型的目录来自于Egg格式的分发包,.dist-info类型的目录来自于Wheel格式的分发包。

参考

Unable to display frame variables (PyCharm remote debugger)
pyc文件反编译到Python源码
ModuleNotFoundError: No module named ‘pip._internal’
【转】Python3中遇到UnicodeEncodeError: ‘ascii’ codec can’t encode characters in ordinal not in range(128)
[Errno 28] No space left on device #5816
解决pip安装超时的问题
如何在Python自己的调试器(PDB)中执行多行语句
Windows下更换pip源为清华源
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-3: ordinal not in range(128)
如何在Python自己的调试器(PDB)中执行多行语句
运行Python时报错ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9‘ not found (required by…)
When would the -e, —editable option be useful with pip install?
学习Python,怎能不懂点PEP呢?
python核心 - 打包与发布
Wheel vs Egg
GLIBCXX_3.4.26 not found
Pycharm 2020.3 - Internal Error - java.net.BindException: Address already in use: bind - Windows 10

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道