2017-06-06 2 views
0

Das Problem

Ich habe eine grundlegende Dateistruktur wie folgt:und laufen mit -m in Apache2

parent_dir/ 
      foo/ 
      Models.py 
      bar/ 
      NeedsModels.py 
      baz/ 
      AlsoNeedsModels.py 

auf meinem lokalen Rechner, Ich betreibe NeedsModels.py mit python3 -m:

python3 -m bar.NeedsModels 

... während mein aktuellen Arbeitsverzeichnis parent_dir ist.

Dies funktioniert wie beabsichtigt, und ich kann Models.py von beiden NeedsModels.py und AlsoNeedsModels.py verwenden, indem Sie:

import foo.Models 

Dies ist jedoch nicht auf dem Apache2 Server funktioniert ich aus 2 Gründen bin bereitstellen:

  1. Das aktuelle Arbeitsverzeichnis beim Zugriff auf NeedsModels.py ist nicht parent_dir.

  2. Das Skript wird nicht mit -m ausgeführt.

Mit einem Standard shebang in NeedsModels.py, wie folgt aus:

#!/usr/bin/python3 -m 

... Fehler (Relative module names not supported), weil es entspricht in etwa zu:

python3 -m ./NeedsModels 

My (hackish) Lösung

Ich fand eine Lösung dafür, indem ich diesen Shebang an die Spitze setzte NeedsModels.py (von diesen question inspiriert):

#!/bin/sh 
""":" 
cd ../ && exec python3 -m bar.NeedsModels 
""" 

Offensichtlich ist dies eine schreckliche Hack ist.

Ich habe die Apache2 docs auf CGI-Skripte gelesen. Aus meiner Sicht wird nicht erwähnt, das aktuelle Arbeitsverzeichnis eines Skripts zu ändern. Ich habe auch im Internet gesucht und konnte keine relevanten Informationen finden.

Wunsch Antworten

Gibt es einen besseren Weg, um dieses Skript mit -m und in der richtigen Arbeitsverzeichnis ohne Änderung der Projektdateistruktur zu laufen? (ich bin mir bewusst, dass NeedsModels.py in parent_dir bewegt dieses Problem wäre zu beheben, aber das ist keine Option für mich.)

Oder können die import Aussagen geändert werden sowohl lokal als auch auf dem Server zu arbeiten?

Antwort

0

Sie können das Verzeichnis foo an sys.path anhängen. Sie können dann foo ohne cd überall importieren.

import sys 
sys.path.append('path/to/foo') 
import foo.Models 
+0

Danke für die Antwort. Gibt es eine Möglichkeit, dies zu erreichen, ohne viele Dateien zu ändern? Zum Beispiel hängt 'NeedsModels.py' von vielen anderen Projektdateien ab, die ähnliche 'import'-Anweisungen verwenden. –

+0

Ja. Sie können den PYTHONPATH in Ihrer .bash_rc-Datei anhängen. sys.path nimmt seine Werte tatsächlich von dort. –