- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章对Python3 pyc 文件的使用详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
什么是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 。
1、引入模块、包生成 。
如果模块或包被其他的模块引入后,执行引入模块就会生成pyc文件(被动生成,如果是python2,会在本级目录生,如果是python3的话就在本级目录新建一个__pycache__文件,然后在__pycache__中生成pyc文件) 。
2、代码编译生成 。
1. 单个文件 。
python就是个好东西,它提供了内置的类库来实现把py文件编译为pyc文件,这个模块就是 py_compile 模块.
使用方法非常简单,如下所示,直接在idle中,就可以把一个py文件编译为pyc文件了.
1
2
3
4
5
6
7
|
>>>
import
py_compile
>>> py_compile.
compile
(r
'/Users/zhangyi/Downloads/md5.py'
)
'/Users/zhangyi/Downloads/__pycache__/md5.cpython-37.pyc'
>>>
Geek
-
Mac:__pycache__ zhangyi$ ls
md5.cpython
-
37.pyc
|
compile函数原型:
1
|
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中,而不会引发异常 。
2. 多个文件 。
一般来说,我们的工程都是在一个目录下的,一般不会说仅仅编译一个py文件而已,而是需要把整个文件夹下的py文件都编译为pyc文件,python又为了我们提供了另一个模块:compileall 。使用方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
>>>
import
compileall
>>> compileall.compile_dir(r
'/Users/zhangyi/Downloads/MainText'
)
Listing
'/Users/zhangyi/Downloads/MainText'
...
Listing
'/Users/zhangyi/Downloads/MainText/.idea'
...
Listing
'/Users/zhangyi/Downloads/MainText/.idea/inspectionProfiles'
...
Compiling
'/Users/zhangyi/Downloads/MainText/Api.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/Block.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/JieBa.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/Login.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/Lxml.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/Mat.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/Myre.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/NLP.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/Post.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/Text.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/get_project_url.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/headless_chrome_Test1.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/headless_chrome_Test2.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/learning.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/nsfc.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/re.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/spider_image.py'
...
Compiling
'/Users/zhangyi/Downloads/MainText/unit.py'
...
True
>>>
Geek
-
Mac:__pycache__ zhangyi$ pwd
/
Users
/
zhangyi
/
Downloads
/
MainText
/
__pycache__
Geek
-
Mac:__pycache__ zhangyi$ ls
Api.cpython
-
37.pyc
Text.cpython
-
37.pyc
Block.cpython
-
37.pyc
get_project_url.cpython
-
37.pyc
JieBa.cpython
-
37.pyc
headless_chrome_Test1.cpython
-
37.pyc
Login.cpython
-
37.pyc
headless_chrome_Test2.cpython
-
37.pyc
Lxml.cpython
-
37.pyc
learning.cpython
-
37.pyc
Mat.cpython
-
37.pyc
nsfc.cpython
-
37.pyc
Myre.cpython
-
37.pyc
re.cpython
-
37.pyc
NLP.cpython
-
37.pyc
spider_image.cpython
-
37.pyc
Post.cpython
-
37.pyc
unit.cpython
-
37.pyc
Geek
-
Mac:__pycache__ zhangyi$
|
这样就把MainText目录,以及其子目录下的py文件编译为pyc文件了。嘿嘿,够方便吧。来看下compile_dir函数的说明:
1
|
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,则编译后,不会在标准输出中,打印出信息 。
3、通过 Python Shell 命令生成 。
直接通过命令来运行,可以看到下面的命令中并没有用到compile()函数, 这是因为py_compile模块的main()函数中调用了compile(). 。
1
2
3
|
python3
-
m py_compile md5.py
python3
-
O
-
m py_compile md5.py
|
-O 优化成字节码 。
-m 表示把后面的模块当成脚本运行 。
-OO 表示优化的同时删除文档字符串 。
如果你想看compile(), compile_dir(), compile_path()具体每个参数是干吗用的,可以使用print py_compile.compile().__doc__来查看,或者直接打开py_compile.py,compileall.py文件来看.
运行pyc文件 。
直接运行即可! 。
1
2
3
4
5
|
Geek
-
Mac:__pycache__ zhangyi$ python3 md5.pyc
tokenKey
=
=
>
696f6d1af498db3c54ffa572a2723cb7
timeStamp
=
=
>
1530954550
find
=
=
>
100
Geek
-
Mac:__pycache__ zhangyi$
|
总结 。
通过上面的方法,可以方便的把py文件编译为pyc文件了,从而可以实现部分的源码隐藏,保证了python做商业化软件时,保证了部分的安全性吧,继续学习下,看怎么修改opcode.
以上这篇对Python3 pyc 文件的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/yilovexing/article/details/80952639 。
最后此篇关于对Python3 pyc 文件的使用详解的文章就讲到这里了,如果你想了解更多关于对Python3 pyc 文件的使用详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
当我第一次开始使用 Django 应用程序时,我不记得这些文件在那里,并且 Django 教程的文件列表中也没有提到它们 我对此进行了更多研究,发现这些就是所谓的字节码 - 正如 this S.O.
不久前,我不得不将一些服务器从 Python 2.4 升级到 Python 2.5。我发现在 Python 2.4 下创建的 .pyc 文件在 Python 2.5 尝试运行它们时会崩溃。 当我从 2
关于 Python 的 .pyc 文件已经有几个问题,但我还没有读到 1) 何时(在什么情况下)创建这些文件以及 2) 是否有充分的理由保留它们。 更具体地说: 关于 (1):在我运行的 200 个或
根据我所做的测试,使用相同版本的 python(相同的魔数(Magic Number)),64 位解释器可以加载由 32 位版本的 python 生成的 pyc 文件。我假设是相互的。 但是它绝对安全
我有 2 个 Python 文件,名为 numbers.py 和 numpyBasicOps.py。 numbers.py 是一个简单的 Python 文件,没有导入任何模块。 numpyBasicO
我假设标准库类型提示支持全部基于阅读普通源代码,就像 inspect 对某些事情所做的那样,但我查看了 typing.py在标准库中,编译器似乎确实在对象本身上存储了类型提示信息。 所以,如果我这样做
我目前正在开发一个 C# 应用程序,该应用程序应该能够启动多个 Python 解释器。 我读过几篇有关该主题的文章,例如: http://www.awasu.com/weblog/embedding-
我有一个 python 编译的脚本(script.pyc,我没有 .py 文件),它在我的 Windows 命令提示符下运行良好,我想从我的 Java 应用程序中执行它。我尝试使用 runtime()
似乎有时当我从 git 中拉取时,旧的 .pyc 运行而不是新拉取的 .py 文件有没有办法自动清除 .pyc 文件以便它始终运行最新版本? 最佳答案 旧的 .pyc 会被 Python 自动清除,前
我最近开始在树莓派上进行 python 开发。在阅读 .pyc 文件以加速启动时,我想知道如果我在 PC 上测试 .pyc 文件,假设 Rpi 上有相同的 python 模块,它会直接工作吗?还请包括
做的时候: >git status 它在“未跟踪文件”下显示了一个大的 .pyc 文件列表。我不希望它显示这些,因为它会增加噪音。 换句话说,如何让 git 始终忽略所有项目的 .pyc 文件? 编辑
我了解“.pyc”文件是纯文本“.py”文件的编译版本,在运行时创建以使程序运行得更快。但是我观察到一些事情: 修改“py”文件后,程序行为会发生变化。这表明“py”文件已编译或至少经过某种散列过程或
我是 python 的新手,因此是一个愚蠢的问题。 据我所知,在第一次执行 *.py 程序时,字节码会被创建到 *.pyc 中并一直使用到 *.py 文件发生更改。 这个 *.pyc 字节码可以在项目
什么是pyc文件 pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由pytho
我有一个使用几个 PY 文件的程序。在我使用 PY 文件之前,代码工作正常。但是,对于加密,当我删除 PY 文件并只保留 PYC 文件时,程序失败并显示消息:ImportError: 没有名为 abc
我有一个使用几个 PY 文件的程序。在我使用 PY 文件之前,代码工作正常。但是,对于加密,当我删除 PY 文件并只保留 PYC 文件时,程序失败并显示消息:ImportError: 没有名为 abc
假设我有一个像这样组织的 python 代码库: ./mod/: ./__init__.py ./main/main.py ./main/__init__.py ./m
我在一个相当大的项目中重命名了一些文件,并想删除它们留下的 .pyc 文件。我尝试了 bash 脚本: rm -r *.pyc 但这并没有像我想象的那样在文件夹中递归。我做错了什么? 最佳答案 fi
昨天使用Google App Engine在python中开发它停止运行当前版本的脚本。它似乎没有执行最新版本,而是运行了先前预编译的 .pyc,即使 .py 源已更改。 错误消息实际上引用了最新来源
pyc 文件在过去一直是痛苦的原因,我最近看到一些关于防止 python 生成它们的帖子。目前,我们只是在任何代码更改后运行一个脚本来清理它们,以确保生成新的代码,但通常禁用它们会容易得多。在我们的生
我是一名优秀的程序员,十分优秀!