Chamando python de python - persistência de importações do módulo?

votos
2

Então, eu tenho alguns scripts Python, e eu tenho um BaseHTTPServer para servir suas respostas. Se o arquivo solicitado é um .py, então eu vou executar esse script usando execfile (script.py).

A questão é esta: existem regras especiais sobre as importações? Um roteiro precisa ser executado apenas uma vez, e que seria bom para manter os objetos que ele cria viva entre os pedidos. Posso confiar que isso vai acontecer?

O script executado via execfile () executar qualquer forma diferente, ou ter quaisquer problemas de acesso escopo?

Publicado 19/05/2009 em 15:43
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

A documentação para o método execfile é aqui . Uma vez que nenhuma versão específica do python foi especificado, eu vou assumir que estamos falando 2.6.2.

A documentação para execfile especifica que leva três argumentos: o nome do arquivo, um dicionário (para atuar como as variáveis ​​locais), e um segundo dicionário (para atuar como as variáveis ​​globais). Se você omitir o segundo e terceiro argumentos, o conteúdo do arquivo são executados em seu próprio escopo (como um módulo) que captura variáveis ​​locais mas expõe variáveis ​​globais para o escopo pai. Então, se o arquivo cria variáveis ​​locais, eles não serão mantidas, mas variáveis ​​globais serão mantidas.

No entanto, executando execfile sem contextos locais e globais especificadas significa que o arquivo vê os habitantes locais e globais da função de chamada. Para o código que você não confia, isso deve ser considerado uma falha de segurança. Pode geralmente ser sábio para criar dois dicionários para os habitantes locais e globais e passar aqueles em que os segundo e terceiro argumentos para execfile. Se você manter esses dicionários em algum lugar (como em outro dicionário introduzidos pelo nome do arquivo), então você pode voltar a usar esses dicionários na próxima vez que o arquivo é servido, que manterá os objetos criados pelo arquivo vivo.

Então, em suma: execfile não é exatamente como importação. Mas você pode manter dicionários dos moradores e globals para manter os resultados de uma chamada execfile ao redor para ser usado novamente.

Respondeu 19/05/2009 em 16:30
fonte usuário

votos
1

Eu recomendo não usar execfile. Em vez disso, você pode dinamicamente importar o arquivo python pedem como um módulo usando o builtin __import__função. Aqui está um exemplo completo, trabalho que eu escrevi e testado:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/plain")
        self.end_headers()

        filename = self.path.lstrip("/")
        self.wfile.write("You requested " + filename + "\n\n")
        if filename.endswith(".py"):
            pyname = filename.replace("/", ".")[:-3]
            module = __import__(pyname)
            self.wfile.write( module.do_work() )

HTTPServer(("",8080), Handler).serve_forever()

Portanto, neste caso, se alguém visita http: // localhost: 8080 / some_page então "Você solicitou some_page" será impressa.

Mas se você pedir http: // localhost: 8080 / some_module.py então o arquivo some_module.pyserá importado como um módulo Python ea do_workfunção em que o módulo será chamado. Portanto, se esse módulo contém o código

def do_work():
    return "Hello World!"

e você fazer esse pedido, em seguida, a página resultante será

You requested some_module.py

Hello World!

Este deve ser um bom ponto de partida para lidar com essas coisas. Como um aparte, se você está querendo um servidor web mais avançado, eu recomendo CherryPy .

Respondeu 19/05/2009 em 16:31
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more