——第三方库——
第三方库一般存放在site-packages中,在写程序过程中可以直接调用。
同时,自己也可以写第三方库。比如,写一个login的登录程序,然后在另一个.py文件中执行它。调用时这两个文件在同一个目录下。
自己写的login模块为:
![](https://img.haomeiwen.com/i15050389/19b6827dbba979e5.png)
在other_module文件中调用login模块:
![](https://img.haomeiwen.com/i15050389/0be8cfee96764431.png)
我们可以执行看一下,用户名和密码正确的情况下:
![](https://img.haomeiwen.com/i15050389/8a36299643f9c326.png)
用户名密码错误的情况下:
![](https://img.haomeiwen.com/i15050389/66dc41198c957f83.png)
一般在调用库的时候,其寻找路径为:先从当下的目录中寻找,若是没有,则到全局环境变量中寻找。
若是把login.py移到别的目录下,执行程序就会报错。比如我们把login程序移到new_dir目录下:
![](https://img.haomeiwen.com/i15050389/a635fec6c8f54248.png)
我把login.py程序移到new_dir下,在调用login时,先到当下目录中寻找,没有,在到全局环境变量中寻找,也没有,就会报错,显示“No module named 'login ' "。
这种情况解决办法有两种:
①把login.py这个文件放在存放第三方库的site-packages的目录下。
![](https://img.haomeiwen.com/i15050389/af5219853608bbe0.png)
我们再来执行一下这个程序,看有什么结果:
![](https://img.haomeiwen.com/i15050389/f20475cbe78e6eba.png)
成功解决。
②另一种方法是修改全局环境变量,把login.py文件的存放路径添加到全局环境变量中。
——.pyc是什么文件——
我们可以看到,在执行login.py 文件时,会在_pycache_文件夹下生成一个login.cpython-34.pyc文件。
![](https://img.haomeiwen.com/i15050389/2c7d1386aa77d92b.png)
下面我们了解一下.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文件之后,说明对源代码进行了修改,则会重新进行编译。
网友评论