![*.pyc 文件如何执行?](https://linux22.com/image/1222720/*.pyc%20%E6%96%87%E4%BB%B6%E5%A6%82%E4%BD%95%E6%89%A7%E8%A1%8C%EF%BC%9F.png)
我注意到导入可执行 Python 文件会保存一个 *.py[co] 文件,正如预期的那样,但该文件也被标记为可执行文件。我偶然想知道我是否可以直接执行此文件,结果成功了!
复制步骤:
$ echo 'print "Worked."' > testcase.py
$ chmod u+x testcase.py
$ python -c 'import testcase'
Worked.
$ ./testcase.pyc
Worked.
这是怎么回事?为什么我没有收到错误消息?我的系统 Ubuntu 9.04 是否做了一些特殊的事情,还是我忘记了 Linux 的一般工作原理?
$ python --version
Python 2.6.2
$ hd testcase.pyc
00000000 d1 f2 0d 0a a4 4f 08 4b 63 00 00 00 00 00 00 00 |.....O.Kc.......|
00000010 00 01 00 00 00 40 00 00 00 73 09 00 00 00 64 00 |[email protected].|
00000020 00 47 48 64 01 00 53 28 02 00 00 00 73 07 00 00 |.GHd..S(....s...|
00000030 00 57 6f 72 6b 65 64 2e 4e 28 00 00 00 00 28 00 |.Worked.N(....(.|
00000040 00 00 00 28 00 00 00 00 28 00 00 00 00 73 0b 00 |...(....(....s..|
00000050 00 00 74 65 73 74 63 61 73 65 2e 70 79 74 08 00 |..testcase.pyt..|
00000060 00 00 3c 6d 6f 64 75 6c 65 3e 01 00 00 00 73 00 |..<module>....s.|
00000070 00 00 00 |...|
00000073
(包括 hexdump 来显示没有 shebang 行,并且阅读有关 .pyc 格式的内容,这里没有任何内容不是高度特定于 Python 的。)
答案1
也许你的系统有一个binfmt_misc文件的条目.pyc
。查找/proc/sys/fs/binfmt_misc
条目。
答案2
.pyc 文件是原始 .py 文件的字节编译版本。当 .py 文件由 python 执行时,它首先检查是否存在同名的 .pyc 文件,并且原始 .py 文件自创建 .pyc 文件以来没有被修改过。如果这两个条件都满足,那么它就会执行 .pyc 文件,因为它可以省去字节编译 .py 文件的步骤,从而缩短执行时间。因此,正如您所发现的那样,.pyc 文件确实是可执行的。
答案3
仅仅因为文件被标记为可执行文件并不意味着操作系统知道如何执行它。这里发生的事情是 .pyc 文件继承了一些权限(或者假定默认文件系统权限,例如,如果您在 Linux 中的 FAT32 驱动器上)。
一般来说,你不需要执行 .pyc 文件。Python 会存储它们,这样每次导入时就不必重新编译代码。