python配置文件读取环境变量_Python中可选的环境变量设置,Python中如何使用pdb调试脚本...

好记性不如烂笔头,看到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)的编码。

再补充一些关于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)()

-> 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)()

-> 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!w_0050.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值