Wie ein Modul aus einem Verzeichnis auf der Ebene über dem aktuelle Skript importieren

StackOverflow https://stackoverflow.com/questions/1003843

  •  05-07-2019
  •  | 
  •  

Frage

Für meine Python-Anwendung, ich habe die folgende Verzeichnisstruktur:

\myapp
\myapp\utils\
\myapp\utils\GChartWrapper\
\myapp\model\
\myapp\view\
\myapp\controller\

Einer meiner Klasse in \ myapp \ view \ muss eine Klasse importieren genannt GChartWrapper . Aber ich bin immer einen Importfehler ...

myview.py
from myapp.utils.GChartWrapper import *

Hier ist der Fehler:

<type 'exceptions.ImportError'>: No module named GChartWrapper.GChart
      args = ('No module named GChartWrapper.GChart',)
      message = 'No module named GChartWrapper.GChart' 

Was mache ich falsch? Ich habe wirklich eine harte Zeit Module / Klassen in Python zu importieren ...

War es hilfreich?

Lösung

Die __init__.py Datei das GChartWrapper Paket erwartet, dass das GChartWrapper Paket auf PYTHONPATH. Sie können von der ersten Zeile sagen:

from GChartWrapper.GChart import *

Ist es notwendig, die GChartWrapper enthaltenes Paket in Ihrem Paket Verzeichnisstruktur zu haben? Wenn ja, dann eine Sache, die Sie tun können, ist den Pfad hinzugefügt werden, wobei das Paket zur Laufzeit sys.path befindet. Ich nehme es myview.py im myapp\view Verzeichnis? Dann könnten Sie dies vor dem Import GChartWrapper tun:

import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'utils')))

Wenn es nicht notwendig ist es in der Verzeichnisstruktur zu haben, könnte es einfacher sein, es bei der herkömmlichen Stelle installiert zu haben. Sie können das tun, indem Sie den setup.py-Skript ausgeführt wird, der in der GChartWrapper Source-Distribution enthalten ist.

Andere Tipps

Sie importieren keine Module und Pakete von arbritary Pfaden. Stattdessen in Python verwenden Sie Pakete und absolute Importe. Das wird alle zukünftigen Probleme vermeiden.

Beispiel:

erstellen Sie die folgenden Dateien:

MyApp\myapp\__init__.py
MyApp\myapp\utils\__init__.py
MyApp\myapp\utils\charts.py
MyApp\myapp\model\__init__.py
MyApp\myapp\view\__init__.py
MyApp\myapp\controller\__init__.py
MyApp\run.py
MyApp\setup.py
MyApp\README

Die Dateien sollten mit Ausnahme der leer sein:

MyApp\myapp\utils\charts.py:

class GChartWrapper(object):
    def __init__(self):
        print "DEBUG: An instance of GChartWrapper is being created!"

MyApp\myapp\view\__init__.py:

from myapp.utils.charts import GChartWrapper

def start():
    c = GChartWrapper() # creating instance of the class

MyApp\run.py:

from myapp.view import start
start()

Das ist alles! Wenn Sie Ihren Eintrittspunkt (run.py) laufen nennt es eine Funktion auf der Ansicht, und das schafft eine Instanz der Klasse GChartWrapper. Mit dieser Struktur können Sie alles überall importieren und verwenden.

Zur Ergänzung in MyApp\setup.py Sie ein Installationsprogramm für die Anwendung \ myapp Paket schreiben. Verwenden Sie distutils es zu schreiben:

from distutils.core import setup
setup(name='MyApp',
      version='1.0',
      description='My Beautiful Application',
      author='Martin',
      author_email='martin@xxxxxxx.com',
      url='http://stackoverflow.com/questions/1003843/',
      packages=['myapp'],
      scripts=['run.py']
     )

Das ist genug. Nun, wenn die Leute den Ordner MeineAnw herunterladen, können sie es einfach setup.py mit installieren und ausführen run.py. mit Distutils können Pakete in einer Reihe von Formaten, einschließlich Windows installierbar .EXE erzeugen

Es ist der normale Weg Python-Pakete zu verteilen / Anwendungen.

Sie können den Pfad ändern, in dem Python für Dateien sucht.

An der Spitze der Quelldatei hinzu:

import sys
sys.path.append("..") 

oder alternativ kann die Umgebungsvariable ändern:

export PYTHONPATH=..

oder Start in Python 2.5 (wieder unter der Annahme myview ist in myapp \ Ansicht:

from __future__ import absolute_import
from ..utils.GChartWrapper import *

Siehe auch: http: // docs .python.org / whatsnew / 2.5.html # pep-328-absolute-und-Relativ Einfuhren

GChartWrapper ist auch von PyPI zur Verfügung, so dass Sie easy_install oder pip installieren Sie das Modul verwenden können:

sudo pip install GChartWrapper==0.9

Es wird dann automatisch in Ihre PYTHONPATH hinzugefügt werden, und dann können Sie entfernen Sie sie von Ihrem / myapp / utils-Verzeichnis. Wenn Sie nicht sudo verwenden können, sehen Sie sich mit virtualenv (und virtualenvwrapper).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top