2016-04-14 8 views
0

Ich muss einen Import einer Funktion in meinem Python-Projekt durchführen.Wie importiere ich eine Funktion aus dem übergeordneten Ordner in Python?

Ich weiß, dass es Dutzende von ähnlichen Fragen zu SO gibt, aber leider konnte ich nicht die richtige Lösung für mich finden, weil die Antworten entweder zu fraglich oder viel zu allgemein oder nur hässlich sind Hacks (wie mit absoluten Pfaden arbeiten).

Hier ist, wie meine Ordnerstruktur wie folgt aussieht:

PythonClient:. 
│ .gitignore 
│ des.py 
│ des_test.py 
│ des_var2.py 
│ gui.py 
│ index.py 
│ __init__.py 
│ 
├───diffie_hellman 
│ │ diffie_hellman.py 
│ │ diffie_hellman_test.py 
│ │ __init__.py 
│ │ 
│ └───__pycache__ 
│   diffie_hellman.cpython-35.pyc 
│ 
├───hashes 
│ │ collision.py 
│ │ hash_function.py 
│ │ __init__.py 
│ │ 
│ └───__pycache__ 
│   hash_function.cpython-35.pyc 
│   __init__.cpython-35.pyc 
│ 
└───__pycache__ 
     des.cpython-35.pyc 
     des_var2.cpython-35.pyc 

ich die ./hashes/hash_function.py von ./diffie_hellman/diffie_hellman.py importieren müssen. Die ./hashes/hash_function.py Datei enthält die einzige Funktion namens hash_function.

Ich habe eine ganze Reihe von Möglichkeiten ausprobiert, um den Import durchzuführen, aber konnte es einfach nicht tun. bekomme ich immer entweder

SystemError: Parent module '' not loaded, cannot perform relative import

wenn ich . in meiner Import-Anweisung (das heißt from .hashes.hash_function)

oder ich dieses:

ImportError: No module named 'hashes'

Jede __init__.py Datei ist leer.

Hier ist die Liste meiner Versuche:

  1. from hashes import hash_function

  2. from hashes.hash_function import hash_function

  3. from .hashes.hash_function import hash_function

  4. from ..hashes.hash_function import hash_function

  5. import hashes

  6. import hash_function

  7. from .. import hash_function

  8. from . import hash_function

  9. from PythonClient.hashes.hash_function import hash_function


Könnten Sie mir bitte helfen, mein Problem zu lösen und zu verstehen, wie man mit solchen Importen arbeitet?


PS: Die Lösung hier nicht gefunden werden konnte stackoverflow.com/questions/14132789/

+1

Ich schlage vor, Sie lesen http://stackoverflow.com/questions/14132789/python-relative-imports-for-the-billionth-time#answer-14132912 zuerst. 99% der Python Import Frage kann gelöst werden, wenn Sie es sorgfältig genug lesen. – laike9m

Antwort

1

Die Tatsache, dass Sie ein __init__.py mir sagt, dass PythonClient selbst ist eine Bibliothek. Tun Sie . Ich mag immer voll qualifizierte Pfade.

Sie müssen auch Ihre Bibliothek installieren, bevor Sie daraus importieren können. Dies erfordert eine setup.py-Datei in Ihrem Home-Verzeichnis. Danach sollten Sie Ihre Bibliothek zum Testen installieren, z. B. "pip install -e".

+0

Mein Stammordner heißt 'PythonClient'. Aber wenn ich 'von PythonClient.hashs.hash_function import hash_function' bekomme, bekomme ich 'ImportError: Kein Modul namens 'PythonClient'' –

+0

Es gibt mir' Directory'. ' ist nicht installierbar. Datei 'setup.py' nicht gefunden. '. Wenn ich die 'setup.py' Datei erstellen muss, wie soll sie aussehen und wo sollte sie sich befinden? –

+0

Danke, die Erstellung von 'setup.py' hat das Problem gelöst! Könntest du bitte deine Antwort aktualisieren, damit ich sie als beantwortet markieren kann und damit andere Leute sie sehen können? –

1

Ich weiß, Sie haben bereits eine Antwort akzeptiert, aber wenn Sie eine weniger "dauerhafte" Lösung wollten (das heißt, wenn Sie Ihren Code nicht installieren wollten), wäre eine andere Option einfach hinzuzufügen das übergeordnete Element Ihres PythonClient-Verzeichnisses zu Ihrem Pfad. Dies kann dauerhaft (je nach Betriebssystem) oder vorübergehend im Code erfolgen:

import os 
import sys 

p = os.path.abspath('../..') 
if p not in sys.path: 
    sys.path.append(p) 

from PythonClient.hashes.hash_function import hash_function 

Prost!

Verwandte Themen