8

2018-12-05  本文已影响0人  可爱叽叽

——第三方库——

第三方库一般存放在site-packages中,在写程序过程中可以直接调用。

同时,自己也可以写第三方库。比如,写一个login的登录程序,然后在另一个.py文件中执行它。调用时这两个文件在同一个目录下。

自己写的login模块为:

在other_module文件中调用login模块:

我们可以执行看一下,用户名和密码正确的情况下:

用户名密码错误的情况下:

一般在调用库的时候,其寻找路径为:先从当下的目录中寻找,若是没有,则到全局环境变量中寻找。

若是把login.py移到别的目录下,执行程序就会报错。比如我们把login程序移到new_dir目录下:

我把login.py程序移到new_dir下,在调用login时,先到当下目录中寻找,没有,在到全局环境变量中寻找,也没有,就会报错,显示“No module named 'login ' "。

这种情况解决办法有两种:

①把login.py这个文件放在存放第三方库的site-packages的目录下。

我们再来执行一下这个程序,看有什么结果:

成功解决。

②另一种方法是修改全局环境变量,把login.py文件的存放路径添加到全局环境变量中。

——.pyc是什么文件——

我们可以看到,在执行login.py 文件时,会在_pycache_文件夹下生成一个login.cpython-34.pyc文件。

下面我们了解一下.pyc是什么文件。

首先,计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来把高级语言转变成计算机能读懂的机器语言。这个过程分成两类,第一种是编译,第二种是解释。

编译型语言在程序执行之前,会先通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了,从而效率会比较高。最典型的例子就是C语言。

解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。

此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。

其实Python和Java/C#一样,也是一门基于虚拟机的语言,也是一种先编译后解释的语言。

当我们在命令行中输入python hello.py时,其实是激活了Python的“解释器”,告诉“解释器”你要开始工作了。可是在“解释”之前,其实执行的第一项工作和Java一样,是编译。

下面来说一个Python文件执行的具体过程:

当python程序运行时,编译的结果是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。

其实PyCodeObject才是Python编译器真正编译成的结果。

.pyc文件存的是预编译的字节码。

那如果在第二次执行某程序时,作了修改,那怎么办?

Python会在执行程序之前,会先查找有没有pyc文件存在,若是有,则下一步比较.py文件和.pyc文件的更新时间。如果.pyc文件的时间在.py文件之后,则直接载入到.pyc文件中,这样就省掉了编译的时间,可以提高效率;如果.py文件的更新时间在.pyc文件之后,说明对源代码进行了修改,则会重新进行编译。

上一篇 下一篇

猜你喜欢

热点阅读