通常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 | pip install numpy -i https://pypi.douban.com/simple |
至此,如无意外,就能好好装包了,import ~~~
pip 换源
但是每次都加参数,很是不方便,可以修改配置文件使得永久生效。
windows:
在资源管理器的地址栏输入%appdata%
后回车,新建一个pip文件夹,新建文件pip.ini,内容如下:
1 | [global] |
Linux:
修改 ~/.pip/pip.conf
(没有就创建一个), 内容如下:
1 | [global] |
使用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 | net stop 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 | uncompyle6 --help 查看帮助 |
反编译后的效果可以说很理想,如果你的代码格式符合PEP8规范的要求,那就基本和源来的文件一样,不过各种注释就没有了(不能要求太高是不是)。即使不符合PEP8规范,反编译的结果也很好。
解决pip报错
有的时候pip环境会严重错乱,出现了错误AttributeError: '_NamespacePath' object has no attribute 'sort'
或者 ModuleNotFoundError: No module named 'pip._internal'
,网上有很多种解决该错误的方法,但是下面这种方法最有效。
1 | curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py |
硬盘空间不足
当硬盘空间不足时,使用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 | (base) [zhaodali@zdaopt ~]$ pip show tensorflow-gpu |
查看包的位置
要想查看包的安装路径,可以执行(以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知识图谱
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 | ├── patch |
在train.py
想调用patch_gen.py
中的函数。
方法一:需要在sys.path
中添加patch
文件夹路径,但是添加的相对路径以当前工作目录下的相对路径为准。
- 若在当前根目录下执行
python tools/train.py
,此时需要在train.py
中添加
1 | import sys |
- 若在
tools
目录下执行python train.py
,此时需要在train.py
中添加
1 | import sys |
方法二:在执行文件时,添加环境变量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
中。
若执行
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
,则输出为若执行
python -m ipdb
,则会加载../tools
根目录下的maskrcnn_benchmark
文件夹;此时打印sys.path
,则输出为
对比这两个图,可以发现多了路径''
,导致调试情况下与正常情况下调用路径不同。
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)。
- 查看系统中的libstdc++.so.6版本
1 | strings /usr/lib64/libstdc++.so.6 | grep CXXABI |
可以看到系统中CXXABI的版本最高到1.3.7,未达到1.3.9。
- 查看conda或者anaconda中的libstdc++.so.6版本
1 | strings /root/anaconda3/lib/libstdc++.so.6.0.26 | grep 'CXXABI' |
- 将conda中的libstdc++.so.6复制到系统中
1 | cp /root/anaconda3/lib/libstdc++.so.6.0.26 /usr/lib64/libstdc++.so.6 |
- 检查系统中libstdc++.so.6的版本是否更新
补充一个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 | -e,--editable <path/url> |
举个例子,
1 | cd /mnt/private_zhaodali_cq/backdoor/BackdoorExplore/transmart/ |
安装完毕之后,
1 | root@VM-172-194-centos:~# pip show fairseq |
也就是说,此时包的安装路径是/mnt/private_zhaodali_cq/backdoor/BackdoorExplore/transmart/fairseq
。
我们进入pip默认的安装路径/root/anaconda3/lib/python3.8/site-packages
看看什么情况:
1 | root@VM-172-194-centos:~# cd /root/anaconda3/lib/python3.8/site-packages |
也就是说,通过pip install -e
安装的包fairseq,会在site-packages
中建立一个链接,链接到fairseq工程所在的位置。这样做的好处就是当我们修改fairseq库中的代码时,是实时生效的(需要从C、C++等编译到Py文件的除外)。
如何查看pip对应的版本
有的时候会遇到在直接敲python进入python3.9,但是pip或者pip3安装包都会安装到python3.8的情况,遇到这种情况,我们需要查看pip对应的python版本。
1 | pip -V |
可以看出来这个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