Pythonが.pyファイルを見つけるのを防ぐ方法

Pythonが.pyファイルを見つけるのを防ぐ方法

リソースがほとんどないシステム(組み込み)があります。したがって、私のプログラムにはPython .pyoファイル(=バイトコンパイルと最適化)のみをインストールしました。このようなプログラムが実行されると、Pythonは常に.pyファイルを探します(おそらく.pyoを更新する必要があることを確認するため)。興味深いことに、5分で25000回のstat64()呼び出し(および8304回のgetcwd()呼び出し)を実行しました。

getcwd("/tmp", 1026)                = 9
getcwd("/tmp", 1026)                = 9
stat64("MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python2.5/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python25.zip/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python2.5/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python2.5/plat-linux2/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python2.5/lib-tk/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python2.5/lib-dynload/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("MyProgram.py", 0xbeb94cc8) = -1 ENOENT (No such file or directory)
getcwd("/tmp", 1026)                = 9
stat64("MyProgram.py", 0xbeb94bc4) = -1 ENOENT (No such file or directory)

Pythonがこのようなことをするのをどのように防ぐことができますか?

答え1

あなたは交換を試すことができます__builtins__.__import__関数(importステートメントによって呼び出されます)を独自のコードとして使用します。あなたはそれを使用することができますimp.load_module関数はpy/pyc/pyoファイルをロードします。

非常に単純なバージョンは次のとおりです。

import sys
import imp

real_import = __builtins__.__import__

def pyc_only_import(name, globals = globals(), locals = locals(), fromlist = [], level = 0):
    pycname = name + ".pyc"
    modfile = open(pycname)
    return imp.load_module(name, modfile, pycname, (".pyc", "rb", 2))

__builtins__.__import__ = pyc_only_import

import hello

完全には実装されていませんが、__import__現在の作業ディレクトリにhello.pycファイルがある場合は動作します。

関連情報