python debugger 线上 服务器端 代码调试神器 ipdb

写python代码的童鞋一般会在pc机器上使用IDE来调试自己的程序,那么如果一个python脚本或者一堆程序文件的代码在Linux环境上运行的时候出错了,我们该如何调试呢?在这里小店为各位客官推荐一款Linux 服务器端的python代码调试神器–ipdb.

传送门啊: https://pypi.org/project/ipdb/

1、安装

pip install ipdb

2、使用方式

两种使用方式,一种是在执行时指定python的运行模块,另一种是直接在代码中侵入式的方式。

python -m ipdb xxx.py

执行脚本或者程序时,带m参数的运行方式会从脚本的入口函数进入debug模式;这种方式没法精准快速的运行到你想要调试的代码位置。

def test():
  print("in test")
  from ipdb import set_trace
  set_trace()
  print("finish test")

第二种方式是直接在代码中import set_trace ,如下边test方法中,加入两行代码,之后保存退出。直接执行文件,那么直接就会在运行到你添加代码的位置暂停。一般会有如下图的效果。

python xxx.py
ipdb运行的debug模式样例

3、常用命令

无论哪种方式,运行代码到debug模式后,你需要通过命令来显示的调试你的代码。逐行逐句的找到代码可能出错的问题所在。一般会需要你在ipdb>后边输入对应的命令来进行后续的调试动作。

一行一行的运行代码是输入 n + 回车
进入方法内是输入 s + 回车
直接一次全部运行到最后是输入 c + 回车
….

  • ENTER(重复上次命令)
  • c(继续)
  • l(查找当前位于哪里)
  • s(进入子程序)
  • r(运行直到子程序结束)
  • !<python 命令>
  • h(帮助)
  • a(rgs) 打印当前函数的参数
  • j(ump) 让程序跳转到指定的行数
  • l(ist) 可以列出当前将要运行的代码块
  • n(ext) 让程序运行下一行,如果当前语句有一个函数调用,用 n 是不会进入被调用的函数体中的
  • p(rint) 最有用的命令之一,打印某个变量
  • q(uit) 退出调试
  • r(eturn) 继续执行,直到函数体返回
  • s(tep) 跟 n 相似,但是如果当前有一个函数调用,那么 s 会进入被调用的函数体中

4、可能会遇到的问题

问题一、TypeError: __init__() got an unexpected keyword argument ‘column‘

这是由于jedi这个库版本太高导致的不兼容,所以降一下版本即可:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jedi==0.17

问题二、AttributeError: ‘NoneType’ object has no attribute ‘tb_frame’

这是由于prompt-toolkit这个库版本太高导致的不兼容,所以降一下版本即可:

python -m pip install -U prompt-toolkit~=2.0

总结一下就是安装ipdb的时候不要默认安装最新的版本就会少很多问题,其实本质上就又回到了python不同模块不同版本兼容性的问题上,安装的时候尽可能安装次新版本即可避免很多问题。

anaconda 常用命令 创建 激活 关闭 删除

anaconda是一个开源的Python发行版本,包含了大量的科学包,其包含了conda、Python等180多个科学包及其依赖项。Anaconda 的下载文件比较大,如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和 Python)。

安装环境: linux centos系统

1、安装与升级、卸载

anaconda的官方下载地址下载Linux版本,也可以在Linux系统中通过wget + down_url的方式下载所需的sh文件,下载完成后直接运行sh文件即可。

bash Anaconda3-2019.07-Linux-x86_64.sh

一路下一步,一直到提示你是否默认安装到/root/anaconda3这个目录下的时候,一般Linux系统的root目录磁盘容量不大,随着anaconda创建的虚拟环境或者安装的包越来越多就会对系统盘的空间造成压力,我们这个时候要自己指定一个安装路径,例如,输入/data/anaconda3(如果有/data盘),然后回车。

一路默认安装完成后 ,一般情况在用户根目录的 .bashrc文件中会有如下内容,下边的内容以>>> conda initialize >>>开始和结束,建议读者将这些内容都注释掉,因为不注释掉每次登陆linux session都会默认进入anaconda的base环境中,尤其是跟不同项目在同一台机器的清下,会对其它的项目环境造成影响。

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
#__conda_setup="$('/data/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
#if [ $? -eq 0 ]; then
#    eval "$__conda_setup"
#else
#    if [ -f "/data/anaconda3/etc/profile.d/conda.sh" ]; then
#        . "/data/anaconda3/etc/profile.d/conda.sh"
#    else
#        export PATH="/data/anaconda3/bin:$PATH"
#    fi
#fi
#unset __conda_setup
# <<< conda initialize <<<

注释掉.bashrc的conda initallize后,我们可能没法直接找到conda命令,需要我们在注释掉之后把export PATH=”/data/anaconda3/bin:$PATH” 放开到该文件的其它行。wq保存退出后,source .bashrc。即可招到conda命令

conda update conda          #基本升级
conda update anaconda       #大的升级
conda update anaconda-navigator    //update最新版本的anaconda-navigator   
# 删除只需要直接删掉安装路径下的整个文件夹即可
rm -rf /data/anaconda3  
# 最后,建议清理下.bashrc中的Anaconda路径。

2、conda基本命令

conda create -n xxxx python=3.5   #创建python3.5的xxxx虚拟环境
conda activate xxxx               #开启xxxx环境
conda deactivate                  #关闭环境
conda env list                    #显示所有的虚拟环境
conda info --envs                 #显示所有的虚拟环境
conda list         #查看已经安装的文件包
conda list  -n xxx       #指定查看xxx虚拟环境下安装的package
conda update xxx   #更新xxx文件包
conda uninstall xxx   #卸载xxx文件包

有的时候,进入特定环境的时候输入conda activate会无效,我们只需要修改成一下命令即可。

source activate xxxx               #开启xxxx环境
source deactivate                  #关闭环境

3、环境的创建、删除、清理

conda create -n xxxx python==3.7 // 创建名字是xxxx且默认python版本是3.7的虚拟环境
conda remove -n xxxx --all   //创建xxxx虚拟环境
conda clean -p      //删除没有用的包
conda clean -t      //删除tar包
conda clean -y --all //删除所有的安装包及cache
//克隆oldname环境为newname环境
conda create --name newname --clone oldname 
//彻底删除旧环境
conda remove --name oldname --all     

4、包的查找、安装、删除

conda search -t conda tensorflow  // 查找
conda show <USER/PACKAGE>  // 显示信息
conda show tensorflow
conda install --channel https://conda.anaconda.org/anaconda tensorflow=1.8.0  // 指定源的安装

遇到错误 error command gcc failed with exit status 1 基本解决思路

我们在使用pip安装包的时候会遇到一些跟gcc相关的错误,类似于下图,图片的内容不全,但是一般的报错都相似,网上搜一下给出的解决方案一般是因为缺少gcc组件,需要安装,如果系统是centos,那么我们会使用yum安装;如果是ubuntu会使用apt-get安装gcc,例如用yum安装

yum install gcc
gcc错误

一般单纯的安装gcc还不能解决问题的话,就再多安装一些东西,如

yum install gcc libffi-devel python-devel openssl-devel -y

如果以上还不能解决,那么就需要确认一下我们安装的pip包对应的python版本是否合适。例如pyltp这个包,你如果直接在python3.7及以上安装,按多少包都是不行的,那么就必须把python的版本降低到至少3.6才可以。