Como você modifica o sys.path no Google App Engine (Python)?
-
23-09-2019 - |
Pergunta
Tentei adicionar a seguinte linha ao meu script de manipulador (main.py), mas não parece funcionar:
sys.path.append ('subdir')
subdir
vive no diretório minha raiz (ou seja, aquele que contém app.yaml
).
Isso não parece funcionar, porque quando tento importar módulos que vivem em subdir
, meu aplicativo explode.
Solução
1) Certifique -se de ter um espaço em branco __init__.py
arquivo em subdir
.
2) use um caminho completo; algo assim:
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), 'subdir'))
Editar: Fornecer mais informações para responder a perguntas feitas em um comentário.
Como Nick Johnson demonstra Você pode colocar essas três linhas de código em um arquivo chamado fix_path.py
. Então, em seu main.py
Arquivo, faça isso import fix_path
antes de todas as outras importações. Link para um aplicativo testado usando esta técnica.
E sim, o __init__.py
o arquivo é necessário; por documentação:
Ao importar o pacote, o Python pesquisa através dos diretórios no SYS.Path, procurando o subdiretório do pacote.
o
__init__.py
Os arquivos são necessários para fazer com que o Python trate os diretórios como contendo pacotes; Isso é feito para impedir que os diretórios com um nome comum, como string, de ocultar involuntariamente módulos válidos que ocorrem posteriormente no caminho de pesquisa do módulo. No caso mais simples,__init__.py
pode ser apenas um arquivo vazio, mas também pode executar o código de inicialização do pacote ou definir o__all__
variável, descrita posteriormente.
Outras dicas
Funcionou para mim inserindo os novos diretores como as primeiras entradas do sys.path.
path_changer.py:
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'libs'))
sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'apps'))
App.py:
import path_changer
from google.appengine.ext.webapp.util import run_wsgi_app
from flask import Flask
import settings
app = Flask('myapp')
app.config.from_object('settings')
from website import views as website_views
run_wsgi_app(app)