2017-07-06 3 views
2

Ich versuche, ein einfaches Projekt in Python zu erstellen, aber ich kann nicht den Kopf darüber verdecken, wie es gemacht wird, obwohl ich die Dokumentationen immer und immer wieder lese und Beispielcode lese.Modul/Projektstruktur in Python

Ich bin halb neu zu Python, mit einem Hintergrund von nur Single-File-Scripting. Allerdings habe ich zahlreiche Node.js und Java-Projekte mit mehreren Ordnern und Paketen gemacht. In Python jedoch kann ich nicht die Projektstruktur und Workflow-Mechanismen zu erfassen-init .py, virtualenvs, setuptools etc. es scheint alles sehr fremd und nicht intuitiv für mich, verletzt meine Gesamtproduktivität (ironischerweise soll Python sein eine Sprache, auf die Produktivität ausgerichtet, rechts)

Mein Projekt dieses Beispiel Struktur hat:

package_test (package) 
    | 
    |------- __init__.py 
    |------- main.py (entry point) 
    | 
    |------- /lib (modules) 
    |   | 
    |   |----- __init__.py 
    |   |----- lib.py 
    | 
    |------- /Tests 
    |   | 
    |   |----- __init__.py 
    |   |----- test.py 

in main.py:

from lib import lib 

lib.libtest() 

in lib.py:

def libtest(): 
    print("libtest") 

in test.py:

from lib import lib 

lib.libtest() 

Lauf main.py funktioniert, aber wenn test.py es ausgeführt wird, kann das Modul nicht finden. Ich habe versucht, Lösungen wie an sys.path anhängen, setzen ".." vor der lib, und mehr - keiner hat funktioniert.

Dies ist nur ein Beispiel, aber ich möchte in Zukunft komplexere Projekte in Python mit mehreren Unterordnern entwickeln (ich denke, Python hat einige coole Funktionen und nette Bibliotheken), aber dieses Problem beschäftigt mich weiter. Ich hatte nie über diese Dinge zu denken, wenn in Java oder in Knoten zu entwickeln, nicht Sachen wie virtualenv usw.

Vielen Dank im Voraus erwähnen

+0

Nicht ein anwer Sie in Frage tatsächlich aber virtualenv und Setuptools sind völlig unabhängig von Ihrem Problem . Und glauben Sie mir, virtualenv __is__ ein sehr cooles Feature - eigentlich eine, auf die Sie nicht hoffen können, ohne zu leben, wenn Sie mehr als nur auf ein einzelnes Projekt warten müssen. –

+0

Vielleicht möchten Sie auch lesen (zumindest die ersten beiden Antworten) https://stackoverflow.com/questions/11536764/how-to-fix-attempted-relative-import-in-non-package-even-with- init-py –

Antwort

0

Ihre test.py muss wissen, lib.py eine Ebene darüber und im lib-Ordner. Sie müssen also nur den Pfad Ihres lib-Ordners anfügen, bevor Sie den Import von lib.py in test.py ausführen. So etwas wie

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

Bitte beachten Sie, dass die obige Antwort davon ausgeht, dass Sie unter Windows laufen. Ein umfassenderer Ansatz bestünde darin, die Windows-Pfade durch die richtige os.path-Syntax zu ersetzen. Eine weitere Annahme, die von diesem Code gemacht wird, ist, dass Sie test.py aus seinem Ordner ausführen, nicht mit einem absoluten/relativen Pfad.

import sys 
import os.path 
sys.path.append(os.path.join(os.path.pardir, 'lib')) 
import lib 

Wenn Sie Ihren test.py mit einem Pfad ausgeführt werden soll, könnte Ihr Code wie folgt aussehen:

import sys 
import os.path 
# os.path.abspath(__file__) gets the absolute path of the current python scrip 
# os.path.dirname gets the absolute path of whatever file you ask it to (minus the filename) 
# The line below appends the full path of your lib folder to the current script's path 
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), os.path.pardir, 'lib')) 
# This should allow test.py to import libtest regardless of where your run it from. Assuming your provided project structure. 
from lib import libtest 
libtest() 
+0

Funktioniert nicht, sagt "kein Modul mit dem Namen 'lib" –

+0

Versuchen Sie immer noch lib von lib zu importieren (was übrigens nicht existiert) oder haben Sie meinen Code versucht? – BoboDarph

+0

Ich habe Ihren Code mit os-agnostischen relativen Pfad versucht, immer noch das gleiche Ergebnis. Ich benutze Linux btw –