[python] Importieren von Dateien aus einem anderen Ordner


Answers

Nichts ist falsch mit:

from application.app.folder.file import func_name

Stellen Sie nur sicher, dass der Ordner auch ein __init__.py enthält, damit es als Paket eingebunden werden kann. Nicht sicher, warum die anderen Antworten über PYTHONPATH sprechen.

Question

Ich habe folgende Ordnerstruktur.

application/app/folder/file.py

und ich möchte einige Funktionen aus file.py in eine andere Python - Datei importieren, die sich in

application/app2/some_folder/some_file.py

ich habe es versucht

from application.app.folder.file import func_name

und einige andere verschiedene Versuche, aber bis jetzt konnte ich nicht richtig importieren. Wie kann ich das machen?




Das funktioniert bei mir unter Windows

# some_file.py on mainApp/app2 
import sys
sys.path.insert(0, sys.path[0]+'\\app2')

import some_file



Ihr Problem ist, dass Python im Python-Verzeichnis nach dieser Datei sucht und sie nicht findet. Sie müssen angeben, dass Sie über das Verzeichnis sprechen, in dem Sie sich befinden, und nicht über das Python-Verzeichnis.

Um dies zu tun, ändern Sie dies:

from application.app.folder.file import func_name

zu diesem:

from .application.app.folder.file import func_name

Fügen Sie den Punkt hinzu, den Sie sagen, suchen Sie in diesem Ordner nach dem Anwendungsordner, anstatt im Python-Verzeichnis zu suchen.




In meinem Fall musste ich eine Klasse importieren. Meine Datei sah folgendermaßen aus:

# /opt/path/to/code/log_helper.py
class LogHelper:
    # stuff here

In meiner Hauptdatei habe ich den Code eingefügt über:

path.append("/opt/path/to/code/")
from log_helper import LogHelper






Wenn Sie die application als Stammverzeichnis für Ihr Python-Projekt betrachten, erstellen Sie eine leere Datei __init__.py in den application , application und __init__.py . Dann some_file.py in deiner some_file.py wie folgt aus, um die Definition von func_name zu erhalten:

import sys
sys.path.insert(0, r'/from/root/directory/application')

from application.app.folder.file import func_name ## You can also use '*' wildcard to import all the functions in file.py file.
func_name()



Die Verwendung von sys.path.append mit einem absoluten Pfad ist nicht ideal, wenn die Anwendung in andere Umgebungen verschoben wird. Die Verwendung eines relativen Pfads funktioniert nicht immer, da das aktuelle Arbeitsverzeichnis davon abhängt, wie das Skript ausgeführt wird.

Da die Anwendungsordnerstruktur fest ist, können wir os.path verwenden, um den vollständigen Pfad zu erhalten. Zum Beispiel, wenn dies die Struktur ist:

/home/me/application/app2/some_folder/vanilla.py
/home/me/application/app2/another_folder/mango.py

Nehmen wir an, Sie möchten das Modul "Mango" importieren. Sie können in vanilla.py Folgendes tun:

import sys, os.path
mango_dir = (os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
+ '/another_folder/')
sys.path.append(mango_dir)
import mango

Natürlich brauchen Sie die Variable mango_dir nicht.

Um zu verstehen, wie das funktioniert, sehen Sie sich dieses interaktive Session-Beispiel an:

>>> import os
>>> mydir = '/home/me/application/app2/some_folder'
>>> newdir = os.path.abspath(os.path.join(mydir, '..'))
>>> newdir
    '/home/me/application/app2'
>>> newdir = os.path.abspath(os.path.join(mydir, '..')) + '/another_folder'
>>> 
>>> newdir
'/home/me/application/app2/another_folder'
>>> 

Und überprüfen Sie die os.path Dokumentation.




Ich bin etwas ganz Besonderes: Ich benutze Python mit Windows!

Ich vervollständige nur die Information: sowohl für Windows als auch für Linux arbeiten sowohl der relative als auch der absolute Pfad in sys.path (ich brauche relative Pfade, weil ich meine Skripte auf den verschiedenen PCs und unter verschiedenen Hauptverzeichnissen verwende).

Und bei der Verwendung von Windows können sowohl \ als auch / als Trennzeichen für Dateinamen verwendet werden und natürlich müssen Sie \ in Python-Zeichenfolgen doppelklicken.
einige gültige Beispiele:

sys.path.append('c:\\tools\\mydir')
sys.path.append('..\\mytools')
sys.path.append('c:/tools/mydir')
sys.path.append('../mytools')

(Hinweis: Ich denke, dass / ist bequemer als \ , Ereignis, wenn es weniger 'Windows-nativ' ist, weil es Linux-kompatibel ist und einfacher zu schreiben und in Windows Explorer kopieren)




Links