python渐进-代码的运行环境

9.3 代码的运行路径

代码在运行的时候会有一个路径集合。所有运行的时候需要import的模块,打开文件的默认路径,都会从这个路径集合里面选取。

这个路径集合包括了操作系统的PYTHONPATH变量和python的安装依赖的路径。而后当前代码文件的存放的路径会被添加进去,比如说有个test.py文件存放在 ~/codes/里面,那么~/codes/这个目录也会被添加到路径集合。

在python解析器启动的时候,会自动调用site模块,site模块会把python可以引用的包的路径也添加到路径集合。

site模块会先根据sys.prefix和sys.exec_prefix来获取路径的前缀。下面的代码可以得到自己机器上的路径前缀。

>>> sys.prefix'/Library/Frameworks/Python.framework/Versions/2.7'

在windows系统中,路径的后缀是""和"lib/site_packge"。

而在unix中的后缀则是“lib/pythonX.Y/site-package”和“lib/site-python”

所以在windows中,如果路径存在,site模块会把

/

/lib/site_packge/

添加到路径集合里面。

而在unix中,如果路径存在,site模块会把

/lib/pythonX.Y/site-package/

/lib/site-python/

添加到路径集合里面

同时site模块会在刚刚添加的路径下面寻找 *.pth。如果有pth文件的话,site模块也会把pth文件中指向的子目录添加到路径集合。

比如说/lib/site-python/路径下面有一个test.pth文件,里面有两行

m1m2

如果路径存在的话。site模块会把

/lib/site-python/m1

/lib/site-python/m2

都添加到路径集合里面。

有些pth文件里面一些行是以import开头的,那么这一行会被直接执行。

通过

import sys

print(sys.path)

可以看到代码运行的时候所有的路径集合。如果碰到有模块无法import,或者默认的文件打开路径不正确,都可以通过查看sys.path来分析路径是否被包含进来了。

一般的用户,通过设置操作系统的PYTHONPATH变量以及在代码存放的路径调用python编译器,都可以使得自己的代码顺利运行。

如果是自己做了第三方的包并且想要发布,就可能需要通过site模块的pth文件来管理包文件的目录。

9.4 代码文件的运行环境参数

代码运行的时候可以知道自己的脚本运行的目录,以及代码文件被调用的命令行参数,是被顶层调用还是被模块调用。

代码的运行目录可以使用sys.path[0]来查看。把以下代码保存为文件testpath.py

import sysprint(sys.path[0])

运行就可以看到代码运行的目录

$ python testpath.py/Users/chenosanabin/Documents

通过sys.argv可以查看调用代码的命令行参数,这个信息在使用命令行交互的时候很有用。

我们在刚刚的代码里面加上一句

import sysprint(sys.path[0])print(sys.argv)

运行后

$ python testpath.py 1 2 3/Users/chenosanabin/Documents['testpath.py', '1', '2', '3']

可以看到sys.argv的第一项是代码被调用的名称,如果是通过全路径或者相对路径调用,它也可能会是代码存放的全路径"/Users/chenosanabin/Documents/testpath.py"或者相对路径"./ testpath.py"

而后面的几项则是调用的参数。

如果有需要在命令行模式下运行的python代码文件,利用sys.argv可以大大增强脚本运行的灵活性。

代码文件在运行的时候,可以获知自己是被顶层调用,还是被模块调用,这是通过利用__name__来实现的。

把以下代码保存为文件 module1.py

print('module 1')print(__name__)

此时对其直接运行

$ python module1.pymodule 1__main__

可以看到此时__name__变量的值是__main__,说明它是顶层调用,这个脚本文件是直接调用的。

此时把以下代码保存为文件 testmodule.py,此文件和module.py放到同一个目录下面。

import module1

此时运行testmodule.py

$ python testmodule.pymodule 1module1

可以看到__name__变量的值是module1,说明它是被其他模块调用的。

__name__变量在需要知道是被顶层调用还是模块调用的情况下非常的有用。有一些代码写出来是希望被模块调用的,但在测试的时候希望不用管理另外一个测试代码文件而直接在本代码文件中完成,此时就可以在获知是顶层调用的情况下添加测试代码,而不会影响模块调用。

9.5 代码的交互功能

在代码运行的过程中,可以通过raw_input()来获取用户的输入。实现简单的交互功能。

编写一个简单的代码来体验这个功能,输入以下代码并且保存为testinput.py

#coding=utf8print(u'输入数字')s=raw_input()print(u'您输入的数字是')print(s)

运行的时候可以自己输入数字,再由程序打印出来。

$ python testinput.py输入数字6您输入的数字是6

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180704G0V1I200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券