2016-06-11 7 views
1

Ich bin ein Informatikstudent des ersten Jahres, der zurzeit an einem kleinen Projekt arbeitet, das ich zu Dropbox für Schule speichere.Wie importiert man während der Entwicklung eines Python-Pakets richtig?

Ich entschuldige mich im Voraus für eine potenziell triviale Frage. Aber ich habe wenig bis keine Erfahrung und nachdem ich alle Debugging-Techniken ausprobiert habe, bin ich wirklich festgefahren!

Es hat die folgenden Dateistruktur

school_project/ 
    __init__.py  #(empty) 
    main_functions/ 
     __init__.py #(empty) 
     render.py 
     filter.py 
    helper_functions/ 
     __init__.py #(empty) 
     string.py 
     utility.py 

Derzeit muss ich in utility.py in der Datei render.py gegründet Funktionen nutzen. Mein erster Versuch, dieses Problem zu lösen, war import ..helper_functions.utility in der Datei render.py zu tun.

Leider wurde folgende Fehlermeldung angezeigt.

import ..helper_functions.utility 
    ^
SyntaxError: invalid syntax 

Zunächst einmal habe ich keine Ahnung, warum dieser relative Import nicht funktioniert.

Zweitens, sollte ich stattdessen nur einen absoluten Import verwenden? In der Form import school_project.helper_functions.utility? Wenn ja, müsste ich dann das Verzeichnis hinzufügen, das school_project/ derzeit in PYTHONPATH ist? Wie würde ich das tun?

Würde ich nur PATH und meines Computers PYTHONPATH ändern entsprechend anpassen? Oder sind sie separate Einheiten und der Prozess ist ein bisschen mehr beteiligt? Ich habe mir andere Threads angeschaut, aber alle scheinen zu Laufzeit im Python-Skript selbst zu modifizieren, etwas, was ich als einen riesigen potenziellen Ursprung von Bugs in der Zukunft sehe.

Antwort

1

Dies ist so, wie Sie es tun sollten:

from ..helper_functions import utility 

Das wird nicht funktionieren, wenn Sie Ihr Python-Programm laufen normalerweise aufgrund der relativen Importe.

Dies ist die Art und Weise Sie sollen es laufen:

python3 -m helper_functions.utility 

Aber es ist etwas weitschweifig und mischen sich nicht gut mit einer Shebang-Zeile wie #/usr/bin/env python3!.

Obwohl es nicht einzigartig ist. Ihre Paketstruktur ist komplexer. Sie müssen das Verzeichnis enthalten, das Ihr Paketverzeichnis in PYTHONPATH enthält, und tun Sie es so.

von mypackage.mymodule Import as_int

Sie können dies auch tun. Dies ist jedoch für Anfänger nicht empfehlenswert. Sie zuerst den PYTHONPATH in Code zuerst mit diesem ...

import sys 
import os 

PACKAGE_PARENT = '..' 
SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__)))) 
sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, PACKAGE_PARENT))) 

from mypackage.mymodule import as_int 
+0

Danke für die Antwort. Der Fehler ist nicht verschwunden. Gleicher Syntaxfehler, aber es zeigt jetzt auf die Periode '.' zwischen' helper_functions' und 'Dienstprogramm' – AlanSTACK

+1

Scheint, dass wir Fortschritt bekommen :) –

+0

Probieren Sie dies aus:' from ..helper_functions import-Dienstprogramm' –

0

Absolute Importe werden in Pep 8 empfohlen:

Absolute imports are recommended, as they are usually more readable and tend to be better behaved (or at least give better error messages) if the import system is incorrectly configured (such as when a directory inside a package ends up on sys.path):

Was die PYTHONPATH, es einmal pro Terminal-Sitzung in dem Sie an dem Projekt arbeiten könnte jetzt am besten. Sobald Sie fortfahren, eine IDE wie pycharm zu verwenden, wird dies für Sie automatisch verwaltet

+1

Relative Importe sind nicht mehr so ​​entmutigt, siehe diese Antwort: https://stackoverflow.com/questions/4209641#answer-16748366 – Pawamoy

+1

Diese Formulierung ist nicht in der [aktuellen Revision von pep8] enthalten (https: //www.python .org/dev/peps/pep-0008 /). Stattdessen heißt es: _Absolute Importe werden empfohlen, da sie normalerweise lesbarer sind und sich besser verhalten (oder zumindest bessere Fehlermeldungen ergeben), wenn das Import-System nicht korrekt konfiguriert ist (z. B. wenn ein Verzeichnis in einem Paket endet) sys.path): _ –

+0

Aktualisiert, danke. – renemilk

Verwandte Themen