2016-12-10 6 views
1

Ich möchte mit Python v3.5.2 arbeiten, aber mein Laptop hat auch Python 2.7.10 installiert (es ist ein MacBook). Ich habe eine einfache Python-Projektstruktur wie die folgende. Beachten Sie, dass möglicherweise Artefakte angezeigt werden, weil ich IntelliJ als IDE verwende (z. B. * .pyc-Dateien und * .iml-Datei).Importfehler in Python 3 aber funktioniert mit Python 2

 
. 
├── io 
│   ├── __init__.py 
│   ├── __init__.pyc 
│   ├── __pycache__ 
│   │   └── __init__.cpython-35.pyc 
│   └── me 
│    ├── __init__.py 
│    ├── __init__.pyc 
│    └── model 
│     ├── __init__.py 
│     ├── __init__.pyc 
│     ├── car.py 
│     └── car.pyc 
├── start.py 
└── test-python.iml 

Mein start.py Skript sieht wie folgt aus.

from io.me.model.car import Car 

car = Car("honda", "civic", 2005) 
print(car.model) 

In einem Terminal, wenn ich in python3 start.py geben Sie dann erhalte ich die folgende Fehlermeldung.

 
Traceback (most recent call last): 
    File "start.py", line 1, in 
    from io.me.model.car import Car 
ImportError: No module named 'io.me'; 'io' is not a package 

Allerdings habe ich beschlossen, in python start.py zu geben und ich tatsächlich eine Ausgabe erhalten: civic.

Irgendwelche Ideen, was ich hier falsch mache?

Gibt es auch eine Richtlinie für eine Projektstruktur für Python? Wenn ich aus einer Java-Welt komme, würde ich gerne wissen, ob es eine empfohlene Best-Practice-Methode oder einen sehr eigenwilligen Ansatz für die Struktur eines Python-Projekts gibt (z. B. wie ein typisches Java-Maven-Projekt).

  • Wo lege ich meine Quellen hin?
  • Wo setze ich meine Tests ein?
  • Gibt es ein Build-Tool (wie Maven für Java) für Python, das die Verzeichnisstruktur erleichtert und leitet?
+0

Benennen Sie "io" in etwas anderes um. Vielleicht kollidiert es mit dem eingebauten 'io'-Paket. – MYGz

+0

@MohammadYusufGhazi Ihr Vorschlag funktioniert. Also, wie ich schon sagte, komme ich aus einer Java-Welt, und meine Frage ist, nur weil es bereits ein Paket gibt, das 'io' verwendet, kann kein anderer ein Paket erstellen, das mit diesem Namensraum beginnt. z.B. 'io.meinedomain.project'? In Java können Sie einen 'io'-Namespace teilen, obwohl Sie spezifischer werden möchten, aber es ist in Ordnung,' io' zu verwenden. –

+0

Versuchen Sie so zu importieren. 'from .io.me.model.car Import Auto'. Schau, ob das funktioniert. Es wird das 'io' Paket aus dem aktuellen Verzeichnis importieren. – MYGz

Antwort

2

Es gibt ein Inbuild-Modul in Python namens io. Fügen Sie auch __init__.py in dem Verzeichnis hinzu, in dem der Ordner io vorhanden ist.

Ausgabe in Python2

>>> 
>>> import io 
>>> 
>>> 
>>> dir(io) 
['BlockingIOError', 'BufferedIOBase', 'BufferedRWPair', 'BufferedRandom', 'BufferedReader', 'BufferedWriter', 'BytesIO', 'DEFAULT_BUFFER_SIZE', 'FileIO', 'IOBase', 'IncrementalNewlineDecoder', 'OpenWrapper', 'RawIOBase', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'StringIO', 'TextIOBase', 'TextIOWrapper', 'UnsupportedOperation', '__all__', '__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_io', 'abc', 'open'] 
>>> 

Ausgabe in Python3

Python 3.4.5 (default, Oct 10 2016, 14:41:48) 
[GCC 5.4.0] on cygwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import io 
>>> 
>>> dir(io) 
['BlockingIOError', 'BufferedIOBase', 'BufferedRWPair', 'BufferedRandom', 'BufferedReader', 'BufferedWriter', 'BytesIO', 'DEFAULT_BUFFER_SIZE', 'FileIO', 'IOBase', 'IncrementalNewlineDecoder', 'OpenWrapper', 'RawIOBase', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'StringIO', 'TextIOBase', 'TextIOWrapper', 'UnsupportedOperation', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_io', 'abc', 'open'] 
>>> 

Benennen Sie Ihre io Paket auf etwas anderes.

+0

Es gibt bereits eine Datei '__init __. Py' im Unterverzeichnis' io' (siehe Ausgabe von 'Baum' Befehl oben). Diese '__init __. Py'-Datei ist jedoch leer. Ist das problematisch? –

+0

'__init __. Py' ist nur ein Weg, um es als Paket zu machen. Es gibt kein Problem, wenn es leer ist. – kvivek

+0

Also, es scheint, dass ich diesen 'io' Namensraum nicht benutzen kann, richtig? Denn wenn ich das Verzeichnis "io" einfach umbenannt habe, z. 'ioioio', dann läuft der Python 3-Befehl gegen' start.py'. –