December 5, 2018

Python 杂记之 文件扩展名的区别

作者: Jim Wang 公众号: 巴博萨船长

虽然Python简单并且容易部署,平时开发时,除了常见的py和pyc文件后缀以外,其实python还有一些别的文件扩展名。我们这篇文章就归纳总结一下所有的与python相关的文件扩展名filename extension(又称后缀名)与各种文件扩展名的文件是如何产生,每种文件文件扩展名的作用。

与Python有关扩展名

扩展名相互关系

大部分情况下,我们创建的Python脚本都是以.py为文件扩展名。py文件可以通过python命令或者自己写的py脚本进行编译成pyc。使用命令的方法如下,在cmd输入以下内容。

1
2
3
python -m py_compile /path/to/mycode.py #若批量处理.py文件
#则替换为/path/to/{需要生成.pyc的文件1,文件2,...}.py
#或者/path/to/

也可以在python文件中实现上述过程。

1
2
3
4
5
6
7
#对于文件                                                      
import py_compile
py_compile.compile(r'/path/to/mycode.py') #.py文件
#此处尽可能使用raw字符串,从而避免转义的麻烦。
#比如,这里不加“r”的话,你就得对斜杠进行转义 #对于文件夹
import compileall
compileall.compile_dir("mylib", force=1)

当然如果希望生成.pyo,则可以使用如下命令:

1
python -O -m py_compile /path/to/mycode.py #文件或者目录

-O选项,将.pyc文件优化为.pyo文件,而不是将.py 文件优化编译为.pyo文件。优化编译后的文件略微小于.pyc文件, 减少储存的需求。

编译过后的字节码文件.pyc可以反编译成.py文件。反编译软件叫Easy Python Decompiler,可以从网上自己下载,该工具很容易上手,可以反编译一个文件也可以是文件夹。

虽然编译过后的二进制的字节码可以被反编译。但是如果你不希望自己的代码被别人直接读取,那么可以将字节码.pyc文件打包并公布。虽然与Python的开源精神不相符,但是也算是折中的安全机制。但是值得注意的是:.pyc文件与Python的版本有依赖。即,如果你用Python X编译的pyc文件不能再Python Y中使用,这里的X,Y为代指某些版本,无特定意义。如果强制加载将会引发ImportError异常,异常关键字为Bad magic Number。

下列是部分版本的Magic Number,全部列表请(参考:Magic_Nr):

1
2
3
4
5
6
2.5b3: 62111
2.5c1: 62121
2.5c2: 62131
2.6a0: 62151
2.6a1: 62161
2.7a0: 62171

小结

Python 3.x 的编译过程是与Python2.x 有区别的,Python 3.x 编译的pyc的时候,会在当前目录里生成一个名为pycache的文件夹,为什么会存在该文件夹?Python解释器会将 .py 脚本文件进行编译,并将编译结果保存到pycache目录中。下次再执行时,如果解释器发现某个 .py 脚本没有修改过,就会跳过编译这一步,直接运行以前生成的保存在 pycache文件夹里的 *.pyc 文件。这样就可以大大缩短项目运行前的准备时间;如果你只需执行一个小工程,没关系 忽略这个文件夹就行。而此时你打包pyc的时候就会发现该文件不能正常地被加载,会提示一些错误,常见的错误是解释器和文件路径不匹配。

为了避免上述的问题,我们可以在编译的时候输入特定的参数,如下:

1
python3 -m compileall -b test3

选项-b,指定编译pyc文件的输出到它们的原始位置。(即与Python2中相同)。

这篇文章我们不过多讨论如何生成Pyd文件,和使用这样的文件,该部分内容,我将在以后的关于在python中使用C/C++代码的文章中详细解释。上述内容是自己在Python应用中遇到过的问题,总有不足之处,望见谅并指正。

参考目录:

PEP:441:https://www.python.org/dev/peps/pep-0484/#stub-files

PEP:441:https://www.python.org/dev/peps/pep-0441/

ERSI ArcGIS:http://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/creating-tools/a-quick-tour-of-python-toolboxes.htm

Magic_Nr: https://github.com/google/pytype/blob/master/pytype/pyc/ magic.py


关于本文

由 Barbossa Wang 撰写, 采用 CC BY-NC 4.0 许可协议.

#Python#杂记#文件扩展名