Como impedir que python procure por arquivos .py

6

Eu tenho um sistema com muito poucos recursos (incorporados). Por causa disso, eu só instalei os arquivos python .pyo (= byte compilado e otimizado) para o meu programa. Agora, quando esse programa é executado, o python continua procurando por arquivos .py (provavelmente para ver se o .pyo precisa ser atualizado). O engraçado é que isso faz muito: 25000 chamadas stat64 () (e 8304 chamadas getcwd ()) em 5 minutos!

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)

Como posso evitar que o Python faça isso?

    
por Folkert van Heusden 17.08.2011 / 10:00

1 resposta

4

Você pode tentar substituir a função __builtins__.__import__ (que é chamada por declarações de importação) pelo seu próprio código. Você pode usar a função imp.load_module para carregar o arquivo py / pyc / pyo.

Aqui está uma versão bem simples:

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

Isso está longe de ser uma implementação completa de __import__ , mas funciona se houver um arquivo hello.pyc no diretório de trabalho atual.

    
por 17.08.2011 / 13:28

Tags