2016-04-08 4 views
3

In Python 3 konnte ich das -m-Flag in der Befehlszeile verwenden, um ein beliebiges Verzeichnis als Python-Paket auszuführen oder um Python-Module in diesen Verzeichnissen mit relativen Importen auszuführen. Allerdings scheint dies nicht der Fall in Python zu sein 2.Wie unterscheidet sich die Markierung -m zwischen Python 2 und 3?

Lassen Sie uns sagen, dass ich die folgende Dateistruktur haben:

C:\mflag 
└───pack 
     hey.py 

Und dass der Inhalt von hey.py sind:

from __future__ import print_function 

print("Hello!") 

Warum ist das Verhalten dieser beiden Befehle unterschiedlich?

C:\mflag>python -m pack.hey 
Hello! 

C:\mflag>python2 -m pack.hey 
C:\Python27\python2.exe: No module named pack 
+2

Suspect es ist wahrscheinlich etwas mit [Namensraum-Pakete] zu tun (https://www.python.org/dev/peps/pep-0420/) –

+1

Ich glaube, Sie sollten eine 'Pack \ __ init__ .py' um es zu einem offiziellen Paket zu machen. Python 3 könnte etwas flexibler sein. – ShadowRanger

Antwort

6

dass ein Namespaced Paket ist, durch PEP 0420 eingeführt; speziell:

Bei der Importverarbeitung wird die Importmaschinerie zu Iterierte über jedes Verzeichnis im Stammpfad fortsetzen, wie es in Python tut 3.2. Während für ein Modul oder Paket mit dem Namen „foo“, für jedes Verzeichnis im übergeordneten Pfad suchen:

  • Wenn/foo/_ _ _ init _.py gefunden wird, wird ein reguläres Paket importiert und zurückgegeben. Wenn nicht, aber /foo.{py,pyc,so,pyd} gefunden wird, wird ein Modul importiert und zurückgegeben Die genaue Liste der Erweiterung variiert nach Plattform und ob das -O-Flag angegeben ist. Die Liste hier ist Vertreter.
  • Wenn nicht, aber/foo gefunden wird und ein Verzeichnis ist, wird es aufgezeichnet und der Scan wird mit dem nächsten Verzeichnis im übergeordneten Pfad fortgesetzt.

  • Andernfalls wird der Scan mit dem nächsten Verzeichnis im übergeordneten Pfad fortgesetzt.

+1

Ausgezeichnete Antwort auf OP's explizite "* Why? *" Frage. Es kann auch erwähnenswert sein, dass OP sein gewünschtes Verhalten in Python2 haben kann, indem er ein leeres 'pack \ __ init __. Py' erstellt. Das würde seine implizite Frage "Wie?" Beantworten. –

+0

Das war es! Ein weiterer relevanter Abschnitt aus demselben PEP: "Zulässige implizite Namespace-Pakete bedeutet, dass die Anforderung, eine __init__.py-Datei bereitzustellen, vollständig entfallen kann" – zayora

Verwandte Themen