Day01-Python基础4-模块初识/.pyc是个什么鬼?

 

本节介绍:

  1. Python介绍
  2. Python发展史
  3. Python 2 or Python 3?
  4. Python的安装
  5. Hello World 程序
  6. 变量
  7. 用户输入
  8. 模块知识
  9. .pyc是什么鬼?
  10. 数据类型知识
  11. 数据运算
  12. 表达式 if... else ... 语句
  13. 表达式 for 循环
  14. break 和 continue
  15. 表达式 while 循环
  16. 作业需求

 

九、模块初识  

       Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的Python库支持,以后的课程中会深入讲解常用到的各种库,现在,我们先来象征性的学2个简单的。

sys

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import sys
 
print(sys.argv)
 
 
#输出
$ python test.py
['test.py'] $ python test.py helo world ['test.py', 'helo', 'world'] #把执行脚本时传递的参数获取到了

 

import sys

print(sys.path) #打印环境变量
print(sys.argv)
print(sys.argv[2])

结果:

D:\Projects\pyweb\Day02>python sys_mod.py 1 2 3
['D:\\Projects\\pyweb\\Day02', 'E:\\Program Files\\Python3.6.5\\python36.zip', 'E:\\Program Files\\Python3.6.5\\DLLs', 'E:\\Program Files\\Python3.6.5\\lib', 'E:\\Program Files\\Python3.6.5', 'E:\\Program Files\\Python3.6.5\\lib\\site-packages']
['sys_mod.py', '1', '2', '3']
2

 从sys.path的执行结果中:

E:\Program Files\Python3.6.5\Lib                          这个是python标准库存放的路径

E:\Program Files\Python3.6.5\lib\site-packages     这个是python第三方模块存放的路径

 

  

os

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import os
 
os.system("df -h") #调用系统命令

 


import os

#cmd_res1 = os.system("dir")   #执行命令,不保存结构
#print(cmd_res1)  #返回0,表示执行成功。

cmd_res2 = os.popen("dir")
print(cmd_res2)

结果:

<os._wrap_close object at 0x000001E44F2E8470>

 

-----------------------

import os

#cmd_res1 = os.system("dir")   #执行命令,不保存结构
#print(cmd_res1)  #返回0,表示执行成功。

cmd_res2 = os.popen("dir").read()
print("----> ",cmd_res2)
os.mkdir("new_dir")

结果:

---->   驱动器 D 中的卷是 Data
 卷的序列号是 3A1F-E13D

 D:\Projects\pyweb\Day02 的目录

2018/10/24/周三  18:04    <DIR>          .
2018/10/24/周三  18:04    <DIR>          ..
2018/10/24/周三  18:04               211 os_mod.py
2018/10/24/周三  17:56                88 sys_mod.py
               2 个文件            299 字节
               2 个目录 186,548,580,352 可用字节

  

 

完全结合一下 

import os,sys
 
os.system(''.join(sys.argv[1:])) #把用户的输入的参数当作一条命令交给os.system来执行

  

自己写个模块

python tab补全模块

import sys
import readline
import rlcompleter

if sys.platform == 'darwin' and sys.version_info[0] == 2:
    readline.parse_and_bind("bind ^I rl_complete")
else:
    readline.parse_and_bind("tab: complete")  # linux and python3 on mac
for mac
#!/usr/bin/env python 
# python startup file 
import sys
import readline
import rlcompleter
import atexit
import os
# tab completion 
readline.parse_and_bind('tab: complete')
# history file 
histfile = os.path.join(os.environ['HOME'], '.pythonhistory')
try:
    readline.read_history_file(histfile)
except IOError:
    pass
atexit.register(readline.write_history_file, histfile)
del os, histfile, readline, rlcompleter
for linux

写完保存后就可以使用了

localhost:~ morgan363$ python
Python 2.7.10 (default, Oct 23 2015, 18:05:06)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tab

 你会发现,上面自己写的tab.py模块只能在当前目录下导入,如果想在系统的何何一个地方都使用怎么办呢? 此时你就要把这个tab.py放到python全局环境变量目录里啦,基本一般都放在一个叫 Python/2.7/site-packages 目录下,这个目录在不同的OS里放的位置不一样,用 print(sys.path)  可以查看python环境变量列表。

 

十、.pyc是个什么鬼?

1. Python是一门解释型语言?

       我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled的缩写才对啊!

       为了防止其他学习Python的人也被这句话误解,那么我们就在文中来澄清下这个问题,并且把一些基础概念给理清。

  

2. 解释型语言和编译型语言 

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

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

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

       通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上超过编译型语言。

       此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。

       用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。

 

3. Python到底是什么 

       其实Python和Java/C#一样,也是一门基于虚拟机的语言,我们先来从表面上简单地了解一下Python程序的运行过程吧。

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

       熟悉Java的同学可以想一下我们在命令行中如何执行一个Java的程序:

               javac hello.java

               java hello

 

       只是我们在用Eclipse之类的IDE时,将这两部给融合成了一部而已。其实Python也一样,当我们执行python hello.py时,他也一样执行了这么一个过程,所以我们应该这样来描述Python,Python是一门先编译后解释的语言。

 

4. 简述Python的运行过程

       在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件。

       我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。

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

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

       所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。

 

       注: .pyc是预编译后的一个字节码文件。

 

posted on 2018-10-24 14:05  morgan363  阅读(60)  评论(0)    收藏  举报

导航