交互
- Python3.x
input()
函数接受一个标准输入数据,返回为 string 类型。python3
中raw_input()
和input()
进行了整合,去除了raw_input( )
,仅保留了input( )
函数,其接收任意任性输入,将所有输入默认为字符串处理,并返回字符串类型。
- Python2.x
input()
相等于eval(raw_input(prompt))
,用来获取控制台的输入。raw_input()
将所有输入作为字符串看待,返回字符串类型。而input()
在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型( int, float )。input()
和raw_input()
这两个函数均能接收 字符串 ,但raw_input()
直接读取控制台的输入(任何类型的输入它都可以接收)。而对于input()
,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它括起来,否则它会引发一个 SyntaxError 。
pyc/pyo
pyc文件
文件差异
*.py
:源码文件,由Python
程序解释。*.pyc
:源码经编译后生成的二进制字节码(Bytecode
)文件。它们通常在导入文件时生成。*.pyo
:优化编译后的程序,也是二进制字节码文件。.pyo
文件也是优化编译后的程序(相比于.pyc
文件更小),也可以提高加载速度。对于嵌入式系统,它可将所需模块编译成.pyo
文件以减少容量。- 注意:不同版本编译后的pyc文件是不同的,比如3.4编译的pyc文件在3.3版本的python是无法执行的。
python解释器运行步骤:
- 将
源码
转换成字节码
(二进制) - 将
字节码
转换成机器码
计算机怎么运行py
脚本
- 首先,将源代码翻译为
PyCodeObject
对象(这就是字节码),并将其写入内存当中(方便CPU读取,起到加速程序运行的作用); - 然后,从上述内存空间中读取指令并执行;
- 最后,程序结束后,根据命令行调用情况(即运行程序的方式)决定是否将
PyCodeObject
写回硬盘当中(也就是直接复制到.pyc或.pyo文件中); - 若,再次执行该脚本,则先检查本地是否有上述字节码文件。有则执行,否则重复上述步骤。
总结:模块在每次导入前总会检查其字节码文件的修改时间是否与自身的一致。若是则直接从该字节码文件读取内容,否则源模块重新导入,并在最后生成同名文件覆盖当前已有的字节码,从而完成内容的更新(详见import.py)。这样,就避免了修改源代码后与本地字节码文件产生冲突。
生成pyc/pyo
单个生成pyc文件
- 命令行方式:
python -m py_compile test.py #pyc python -O -m py_compile test.py #pyc+pyo python -OO -m py_compile test.py #pyc+pyo:会进一步移除-O文档字符串 # or python -m compileall test.py #pyc python -O -m compileall test.py #pyc+pyo python -OO -m compileall test.py #pyc+pyo:会进一步移除-O文档字符串
- 脚本方式:
import py_compile if __name__=='__main__': py_compile.compile('test.py') #pyc
- 其下的
py_compile.compile(file[, cfile[, dfile[, doraise]]])
可将.py
文件编译生成.pyc
文件(默认)。
- 其下的
批量生成pyc文件
- 命令行方式
python -m py_compile ./ # or python -m compileall ./
- 脚本生成
import compileall if __name__=='__main__': compileall.compile_dir('./')
反编译
克隆反编译工具:
- git clone https://github.com/rocky/python-uncompyle6.git
运行 - uncompyle6 -o . ~/*.pyc
- 说明:uncompyle6 在文件python-uncompyle6/bin 目录下
即在当前目录下生成原始文件