web-dev-qa-db-ja.com

* .pycファイルはどのように実行されますか?

実行可能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

(Shebang行がないことを示すhexdumpを含み、.pyc形式について読んでいるので、Pythonにあまり固有でないものはここにはありません。)

6
Roger Pate

おそらく、システムには.pycファイルの binfmt_misc エントリがあります。 /proc/sys/fs/binfmt_miscでエントリを探します。

8
Chris Johnsen

.pycファイルは、元の.pyファイルのバイトコンパイルバージョンです。 .pyファイルがpythonによって実行されると、最初に同じ名前の.pycファイルがあるかどうか、および.pycファイルが作成されてから元の.pyファイルが変更されていないかどうかが確認されます。これらの両方が当てはまる場合、.pyファイルをバイトコンパイルするステップを節約して実行時間を短縮できるため、.pycファイルを実行します。したがって、.pycファイルは実際にあなたが発見したように実行可能です。

0
momeara