【转】py文件编译为pyc

原文链接:http://blog.csdn.net/sislcb/article/details/4002414

说明: 我是一个python初学者,希望能够得到各位前辈的指导,大家一起交流。mail:sislcb at 126 dot com

什么是pyc文件

pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的python是无法执行的。

为什么需要pyc文件

这个需求太明显了,因为py文件是可以直接看到源码的,如果你是开发商业软件的话,不可能把源码也泄漏出去吧?所以就需要编译为pyc后,再发布出去。当然,pyc文件也是可以反编译的,不同版本编译后的pyc文件是不同的,根据python源码中提供的opcode,可以根据pyc文件反编译出py文件源码,网上可以找到一个反编译python2.3版本的pyc文件的工具,不过该工具从python2.4开始就要收费了,如果需要反编译出新版本的pyc文件的话,就需要自己动手了(俺暂时还没这能力^--^),不过你可以自己修改python的源代码中的opcode文件,重新编译python,从而防止不法分子的破解。

生成单个pyc文件

python就是个好东西,它提供了内置的类库来实现把py文件编译为pyc文件,这个模块就是 py_compile 模块。

使用方法非常简单,如下所示,直接在idle中,就可以把一个py文件编译为pyc文件了。(假设在windows环境下)

import py_compile

py_compile.compile(r‘H:/game/test.py‘)

compile函数原型:

compile(file[, cfile[, dfile[, doraise]]])

file 表示需要编译的py文件的路径

cfile 表示编译后的pyc文件名称和路径,默认为直接在file文件名后加c 或者 o,o表示优化的字节码

dfile 这个参数英文看不明白,请各位大大赐教。(鄙视下自己)原文:it is used as the name of the source file in error messages instead of file

doraise 可以是两个值,True或者False,如果为True,则会引发一个PyCompileError,否则如果编译文件出错,则会有一个错误,默认显示在sys.stderr中,而不会引发异常

(来自python2.5文档)

批量生成pyc文件

一般来说,我们的工程都是在一个目录下的,一般不会说仅仅编译一个py文件而已,而是需要把整个文件夹下的py文件都编译为pyc文件,python又为了我们提供了另一个模块:compileall 。使用方法如下:

import compileall

compileall.compile_dir(r‘H:/game‘)

这样就把game目录,以及其子目录下的py文件编译为pyc文件了。嘿嘿,够方便吧。来看下compile_dir函数的说明:

compile_dir(dir[, maxlevels[, ddir[, force[, rx[, quiet]]]]])

dir 表示需要编译的文件夹位置

maxlevels 表示需要递归编译的子目录的层数,默认是10层,即默认会把10层子目录中的py文件编译为pyc

ddir 英文没明白,原文:it is used as the base path from which the filenames used in error messages will be generated。

force 如果为True,则会强制编译为pyc,即使现在的pyc文件是最新的,还会强制编译一次,pyc文件中包含有时间戳,python编译器会根据时间来决定,是否需要重新生成一次pyc文件

rx 表示一个正则表达式,比如可以排除掉不想要的目录,或者只有符合条件的目录才进行编译

quiet 如果为True,则编译后,不会在标准输出中,打印出信息

(来自python2.5文档)

总结

通过上面的方法,可以方便的把py文件编译为pyc文件了,从而可以实现部分的源码隐藏,保证了python做商业化软件时,保证了部分的安全性吧,继续学习下,看怎么修改opcode。

【转】py文件编译为pyc

时间: 2024-10-12 21:20:34

【转】py文件编译为pyc的相关文章

【Python】将python的py文件编译成保密的pyc文件

由于python程序的py文件很容易泄露源代码,所以python可以编译成保密的pyc文件. python的pyc文件是一种二进制文件,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念. 编译py文件到pyc文件的方法: 在命令行输入:python -m py_compile myFile.py 就可以生成对应的pyc文件了. 希望对大家有所帮助. -------------------

使用cython将py文件编译成so文件

一.环境准备    安装cython,以及gcc编译环境    wget https://bootstrap.pypa.io/get-pip.py    python get-pip.py pip install cython    yum install -y gcc python-devel 二.编写测试脚本   test.py,内容如下   import os   def test():       print  os.path.realpath('.')   三.将其拷贝到python系

代码编译与反编译 (.py文件与.pyc文件互转)

# 将.py文件转化为.pyc文件,实现代码隐藏的需要,转化后的.pyc文件将在当前目录的__pycache__文件夹下. # .pyc文件的使用与.py文件的使用相同. .py -> .pyc import compileall compileall.compile_dir(folder path) .pyc -> .py # 安装 uncompyle pip install uncompyle # 把 name.pyc 反编译成 name.py uncompyle6 name.pyc &g

python之模块py_compile用法(将py文件转换为pyc文件)

# -*- coding: cp936 -*- #python 27 #xiaodeng #python之模块py_compile用法(将py文件转换为pyc文件) #二进制文件,是由py文件经过编译后,生成的文件. ''' import py_compile #不带转义r py_compile.compile('D:\test.py') Traceback (most recent call last): File "<pyshell#1>", line 1, in &l

模块之字节编译的.pyc文件---from.import语句

字节编译的.pyc文件输入一个模块相对来说是一个比较费时的事情,所以Python做了一些技巧,以便使输入模块更加快一些.一种方法是创建 字节编译的文件 ,这些文件以.pyc作为扩展名.字节编译的文件与Python变换程序的中间状态有关(是否还记得Python如何工作的介绍?).当你在下次从别的程序输入这个模块的时候,.pyc文件是十分有用的——它会快得多,因为一部分输入模块所需的处理已经完成了.另外,这些字节编译的文件也是与平台无关的.所以,现在你知道了那些.pyc文件事实上是什么了. ~~~~

快速配置Python编译环境与第一个py文件程序

1. Python基本语法在此不熬述. 2. 到管网下载Python 3.6.x 版本,与本机匹配的版本,如本机是 win7 64 python-3.6.5-amd64 3. 下载IDE:PythonCharm 如果只是个人开发,为避免不必要的麻烦,下载社区版. 4. 先安装Python 配置windows环境路径Path: 在 Windows 设置环境变量path 这个字符串的最后加上;D:\Python\Python36 即python的安装目录, 以上是我的安装目录 或在命令提示框中(cm

Ubuntu下安装Python3.4及用python编译py文件

1.安装python 3.4程序 sudo apt-get install python3.4 2.python 3.4是被默认安装在/usr/local/lib/python3.4,删除默认pythonlink文件/usr/bin/python,重新建立连接关系 sudo rm /usr/bin/python sudo ln -s /usr/bin/python3.4 /usr/bin/python 3.确认python 版本 python 输入quit()退出,如果显示是python3.4版

用eclipse pydev 创建一个新py文件时 文件的coding设置问题

问题: 当安装好eclipse和pydev后,创建一个project, 创建一个新的py文件,文件头都会自带中文时间.这样在编译的时候会报错. 解决办法之一: 通过设置,可以使新建的文件的文件头自动带一行#coding=utf-8 设置之后,再创建一个新的文件.文件的文件头会自带#coding=utf-8 待续 还有其他方法的朋友,欢迎交流.

tab.py 文件

centos系统下需要使用tab键补全 在/usr/local/lib/python2.7/site-packages/目录下编写一个tab.py 文件 文件内容: #!/usr/bin/python # python startup file import sys import readline import rlcompleter import atexit import os # tab completion readline.parse_and_bind('tab: complete')