2010-03-01 16 views
8

Ich habe versucht, die folgende Zeile in meine Handler-Skript (main.py) hinzufügen, aber es scheint nicht zu funktionieren:Wie ändern Sie sys.path in Google App Engine (Python)?

sys.path.append ('subdir')

subdir lebt in meinem Stammverzeichnis (dh das mit app.yaml).

Das scheint nicht zu funktionieren, denn wenn ich versuche, Module zu importieren, die in subdir leben, explodiert meine App.

+0

10 $ sagt man eine verirrte 'hatte .pyc' Datei, wenn der Fehler "selbst fixiert". –

Antwort

18

1) Stellen Sie sicher, dass Sie eine leere __init__.py Datei in subdir haben.

2) Verwenden Sie einen vollständigen Pfad; so etwas wie dieses:

import os 
import sys 

sys.path.append(os.path.join(os.path.dirname(__file__), 'subdir')) 

Edit: Weitere Informationen bietet in einem Kommentar gestellten Fragen zu beantworten.

As Nick Johnson demonstrates Sie können diese drei Zeilen des Codes in einer Datei mit dem Namen fix_path.py. Führen Sie dann in Ihrer Datei main.py diese import fix_path vor allen anderen Importen durch. Link to a tested application using this technique.

Und, ja, die Datei __init__.py ist erforderlich; pro die documentation:

Wenn das Paket zu importieren, sucht Python durchsucht die Verzeichnisse auf sys.path für das Paket Unterverzeichnis.

Die __init__.py Dateien werden benötigt, um machen Python behandeln die Verzeichnisse als enthält Pakete; Dies wird mit Namen, wie z. B. Zeichenfolge, von verhindern, die unbeabsichtigt gültige Module verbergen, die später auf der Modulsuche Pfad auftreten. Im einfachsten Fall kann __init__.py nur eine leere Datei sein, aber es kann auch die Initialisierung Code für das Paket ausführen oder die Variable setzen, die später beschrieben wird.

+0

Ich möchte kein Paket namens Unterverzeichnis erstellen. Ist das nicht was 1) tun wird? Außerdem, wo würde ich den Code, den Sie unter 2 erwähnt haben, setzen ?? – allyourcode

+0

2) ist die Antwort, die ich suche. 1) Wie Ihr Zitat aus den Dokumenten erklärt, macht dies ein Paket subdir, was NICHT ist, was ich will. – allyourcode

+0

Eigentlich bin ich mir nicht sicher, warum meine ursprüngliche Methode sys.path.append ('subdir') zu main hinzuzufügen.py (der einzige nicht statische Handler in meiner app.yaml) hat nicht funktioniert. Ich habe es gerade noch einmal versucht, aber dieses Mal keine Explosion:/ – allyourcode

2

Es funktionierte für mich das Einfügen der neuen Verzeichnisse als erste Einträge in 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)