设为首页 收藏本站
查看: 942|回复: 0

[经验分享] Python中可选的环境变量设置,Python中如何使用pdb调试脚本

[复制链接]

尚未签到

发表于 2018-8-10 12:54:53 | 显示全部楼层 |阅读模式
  好记性不如烂笔头,看到Python Optional Variables这一块,把学习的东西记录下来
  一. 可选的环境变量设置
  会写Java Hello World的同学一定知道如何设置环境变量,比如:JAVA_HOME,CLASSPATH等。
  Python中也一样有类似的环境变量,有一些还是可选的(比如:PYTHONPATH, PYTHONSTARTUP等)

  •   设置PYTHONPATH
  这个环境变量有什么用呢?
  我们知道在导入模块时(比如:import some_module_name),Python需要在某些路径(即sys.path这个列表中的路径)中去寻找相应的模块,而PYTHONPATH这个变量就是告诉Python,将它的值也加入到搜索路径中(即将PYTHONPATH的值合并到sys.path列表中)。
export PYTHONPATH=/tmp  
python -c "import sys; print 'found' if '/tmp' in sys.path else '' "
  输出结果是:found
  说明/tmp在sys.path中被找到了(即/tmp附加到了sys.path中)
  2. 设置PYTHONSTARTUP
  如果这个环境变量的值是一个可读的文件,那么该文件中的Python命令会在交互模式启动之前执行。
echo "print 'hello world'" > /tmp/a.py  
export PYTHONSTARTUP=/tmp/a.py
  
python
  在启动python交互模式后,会看到有hello world已经被输出了。
  3. 设置PYTHONHOME
  一般在这个变量没有被设置的情况下,Python中的sys.path会列出一些模块的搜索路径。
# 比如:  
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2',
  
'/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old',
  
'/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages',
  
'/usr/lib/python2.7/dist-packages']
  Python模块的搜索路径一般默认是sys.prefix/lib,可以看到很多路径是 /usr/lib/... 这种,其中/usr 就是sys.prefix这个变量的值(windows上可能是你安装Python的目录,比如: C:\Python2.7)。
  如果人工指定了PYTHONHOME,那么sys.prefix的值就会被替换。
  随便替换PYTHONHOME的值,可能造成Python无法启动,替换前请备份sys.prefix的值
  4. 设置PYTHONCASEOK
  这个变量只对Windows起效,可以设置为任意的值(比如:SET PYTHONCASEOK=OK)
  设置了以后,Python对模块的导入,将忽略大小写(只对用户module忽略大小写,对built-in module还是大小写敏感)
  5. 设置PYTHONIOENCODING
  看这个名字,IO Encoding可以猜到这个东西是和输入输出有关的。对,这个环境变量的作用就是指定Python程序标准输入输出(stdin,stdout,stderr)的编码。
  关于这个东西的运用,请参考:http://www.soimort.org/posts/118/  太长不看 :D
  再补充一些关于encode和decode的要点:
  在Python 2.x中,str类型的字符串,都是指string of bytes(二进制流的表示形式),一般来说
  1). '...'.decode([encoding_name])是将string of bytes转化成unicode string
  运用场景是,从网络或者文件中读取了二进制流,然后将其转化为unicode字符串,便于阅读。
  2). u'....'.encode([encoding_name])是将unicode string转化成string of bytes
  运用场景是,将unicode字符串转化成二进制流(Java的叫法也称为字节流),然后推向网络或者文件中。
  另外,还有两个方法,str.encode和unicode.decode,这两个方法意义不大(几乎很少运用)
  "...".encode() 会先默认隐式的用default encoding去decode,即调用"...".decode(sys.getdefaultencoding()) ,然后再继续调用"...".encode()
  而u"...".decode()也会先默认隐式的调用u"...".encode(sys.getdefaultencoding()),然后继续调用u"...".decode()
  二. 使用pdb模块调试、跟踪脚本
  有些时候,需要在没有IDE帮助的情况下,对脚本的运行情况进行调试、跟踪,可以使用Python内置的pdb模块(参考:https://docs.python.org/2/library/pdb.html)
  一个简单的例子:
  对脚本test.py进行跟踪调试
#! /usr/bin/env python  

  
def foo():
  
    s = 0
  
    for i in range(3):
  
        s += i
  
    print s
  

  

  
if __name__ == "__main__":
  
    foo()
  运行命令:
python -m pdb test.py  显示类似如下所示:
> /tmp/test.py(3)<module>()  
-> def foo():
  
(Pdb) l
  
  1      #! /usr/bin/env python
  
  2
  
  3  ->    def foo():
  
  4          s = 0
  
  5          for i in range(3):
  
  6              s += i
  
  7          print s
  
  8
  
  9
  
10      if __name__ == "__main__":
  
11          foo()
  
(Pdb) n
  
> /tmp/test.py(10)<module>()
  
-> if __name__ == "__main__":
  
(Pdb)
  (pdb)是调试提示符,在提示符下可以输入命令(具体参考文档)
  可以在(pdb)提示符下,查看标量的值,可以使用print 语句打印
  常用的简单命令有:
命令全称简写命令描述listl列出当前执行脚本的内容(其中有箭头标注当前执行到的位置)nextn执行下一步,遇到函数不进入其内部。(相当于IDE中的step over)steps执行下一步,遇到函数进入其内部。(相当于IDE中的step into)breakb  设置断点,如果不带参数,则列出当前执行脚本中的所有断点(号)。
  也可以带参数,比如,执行: b 6)代表在脚本的第6行设置断点,如右边所示,它的断点号是1。
(Pdb) b 6  
Breakpoint 1 at /tmp/test.py:6
  
(Pdb) l
  
  5          for i in range(3):
  
  6 B            s += i
  
  7          print s
  
  8
  
  9
  
10  ->    if __name__ == "__main__":
  
11          foo()
clearcl  清除脚本中的断点。
  1)不带参数,会询问是否清除脚本中的所有断点
  2)带参数会清除指定的断点。(注意清除的格式)

  •   cl(ear) [filename:lineno | bpnumber [bpnumber
    ...
    ]]
      With a filename:lineno argument, clear all the breakpoints at this
    line. With a space separated list of breakpoint numbers, clear those
    breakpoints. Without argument, clear all breaks (but first ask confirmation).
  所以,要清除上面设置的第6行的断点,要么使用  cl 1  (清除断点号是1的断点);要么使用  cl test.py:6 (清除test.py中的第6行)
  使用 cl 6是错误的,因为目前为止,没有标号是6的断点!!
continuec继续执行脚本,直到遇到断点停止。quitq退出调试  That's it! DSC0000.gif

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549692-1-1.html 上篇帖子: python 3 使用pymysql 连接Inception 问题 下篇帖子: Python基础复习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表