1089 Stimmen

Importieren von Modulen aus dem übergeordneten Ordner

Ich verwende Python 2.5.

Dies ist mein Ordnerbaum:

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(Ich habe auch __init__.py in jedem Ordner, hier aus Gründen der Lesbarkeit weggelassen)

Wie importiere ich die nib Modul aus dem Inneren des life Modul? Ich hoffe, dass es möglich ist, ohne an sys.path herumzubasteln.

Hinweis: Das Hauptmodul, das ausgeführt wird, befindet sich in der ptdraft Ordner.

1 Stimmen

Wie ist Ihr PYTHONPATH eingestellt?

2 Stimmen

Ross: Ich habe es mir angesehen. Was soll ich dagegen tun? Ich habe bereits eine __init__.py . S.Lott: Ich weiß nicht, wie ich das überprüfen kann...

4 Stimmen

Echo $PYTHONPATH aus der Shell; import sys; print sys.path aus Python heraus. docs.python.org/tutorial/

0voto

fx-kirin Punkte 1776

Zu diesem Zweck habe ich diese Bibliothek erstellt.

https://github.com/fx-kirin/add_parent_path

# Just add parent path
add_parent_path(1)

# Append to syspath and delete when the exist of with statement.
with add_parent_path(1):
   # Import modules in the parent path
   pass

0voto

mj_whales Punkte 125

Dies ist die einfachste Lösung, die für mich funktioniert:

from ptdraft import nib

-1voto

JLT Punkte 672

Obwohl es gegen alle Regeln verstößt, möchte ich diese Möglichkeit dennoch erwähnen:

Sie können die Datei zunächst aus dem übergeordneten Verzeichnis in das untergeordnete Verzeichnis kopieren. Dann importieren Sie sie und entfernen anschließend die kopierte Datei:

zum Beispiel in life.py :

import os
import shutil

shutil.copy('../nib.py', '.')
import nib
os.remove('nib.py')

# now you can use it just fine:
nib.foo()

Natürlich kann es zu verschiedenen Problemen kommen, wenn nibs versucht, andere Dateien mit relativen Importen/Pfaden zu importieren/lesen.

1 Stimmen

Das ist eine kreative Lösung! Ich würde sie aber wahrscheinlich nicht benutzen.

2 Stimmen

Ich würde dringend davon abraten, diese Lösung zu verwenden, sondern das übergeordnete Verzeichnis ebenfalls zu einem Paket zu machen oder einfach das übergeordnete Verzeichnis an Ihr sys.path (wie in den anderen Antworten vorgeschlagen). Das Kopieren/Entfernen der Datei führt eine sehr enge Abhängigkeit vom Speicherort der Datei ein, die bei zukünftigen Änderungen des Projekts unbemerkt bleiben kann (und somit das Skript weniger robust macht). Außerdem wird dadurch verhindert, dass die Datei im Cache gespeichert wird, und es entsteht natürlich auch ein leichter Overhead für das benötigte IO.

2 Stimmen

Ich verstehe, dass die Leute diesen Beitrag ablehnen, da es sich in der Tat um eine schlechte Praxis handelt, und ich würde sie nie verwenden, wenn ich ein Paket oder ein wiederverwendbares Skript schreibe, aber in einigen Fällen kann es sich trotzdem lohnen. Zum Beispiel, wenn man eine interaktive Sitzung durchführt und einige Funktionen verwenden möchte, die in einem Skript an einem anderen Ort definiert sind. Ich glaube, es ist eine gute Praxis, dass diese Art von Lösungen immer noch auf Stackoverflow erwähnt werden.

-4voto

Das funktioniert bei mir, um Dinge aus einem höheren Ordner zu importieren.

import os
os.chdir('..')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X