*.pyc の owner と permission

なんかコメントがついてた。気がつくのが遅くてすみません。

え、python ってそうなの? 自動保存だとパーミッション関連が大変そうだけど、大丈夫なんだろうか。

http://d.hatena.ne.jp/kwatch/20080209#c1202531672


というわけで、調べてみる。


foo.py:

def hello(name):
    print "Hello %s!" % name


main.py:

from foo import hello
hello('World')


result:

$ ls -l main.py* foo.py*   # 最初は *.pyc はない
-rw-r--r--   1 kwatch  kwatch  46 Feb 13 18:18 foo.py
-rw-r--r--   1 kwatch  kwatch  37 Feb 13 18:17 main.py
$ python main.py           # python が *.pyc を生成
Hello World!
$ ls -l main.py* foo.py*   # *.pyc の permission は 0644
-rw-r--r--   1 kwatch  kwatch   46 Feb 13 18:18 foo.py
-rw-r--r--   1 kwatch  kwatch  273 Feb 13 18:19 foo.pyc
-rw-r--r--   1 kwatch  kwatch   37 Feb 13 18:17 main.py
$ rm *.pyc                 # *.pyc を削除
$ sudo chown root foo.py   # owner を変更
$ sudo chmod u-w foo.py    # owner の書き込み権限を削除
$ ls -l main.py* foo.py*   # 現在の状態を確認
-r--r--r--   1 root    kwatch  46 Feb 13 18:18 foo.py
-rw-r--r--   1 kwatch  kwatch  37 Feb 13 18:17 main.py
$ python main.py           # もう一度 *.pyc を生成
Hello World!
$ ls -l main.py* foo.py*   # *.pyc の owner と permission は変わらず
-r--r--r--   1 root    kwatch   46 Feb 13 18:18 foo.py
-rw-r--r--   1 kwatch  kwatch  273 Feb 13 18:23 foo.pyc
-rw-r--r--   1 kwatch  kwatch   37 Feb 13 18:17 main.py


というわけで、結論:

  • Python は、import したファイルからは *.pyc を作るが、コマンドライン引数で指定したファイルからは *.pyc を作らない。
  • *.pyc の owner と permisson は、元ファイルである *.py とは関係ない。


まあ、妥当といえば妥当か。しかし *.py は他人が読めないように設定していても、*.pyc は読めてしまうという可能性があるのは、セキュリティ的には確かに気になるところだ。そこは一人ひとりが気をつけましょうというスタンスなのかな。というよりは、*.pyc も単なるファイルに過ぎないということか。