2016-09-01 3 views
3

ich ein Projekte bestehend aus zwei Paketen wie folgt aus:Import-Modul nicht durch Terminal arbeiten, während es IDE funktioniert durch

MyProjectDir 
-Package1 
--__init__.py 
--file1_1.py 
--file1_2.py 
--file1_3.py 
-Package2 
--__init__.py 
--file2_1.py 
--file2_2.py 
--file2_3.py 

nun in den Paketen die Dateien einige Importe zwischen Dateien haben:

file2_3.py:

from Package2.file2_1 import * 
run_some_code() 

Als ich file2_3.py direkt von PyCharm laufen, läuft alles ok. Aber wenn ich versuche, das Skript im Terminal zu laufen (ich arbeite Windows 7):

D:\SVN Repo\MyProjectDir\Package2> python file2_3.py 

oder alternativ

D:\SVN Repo\MyProjectDir> python ./Package2/file2_3.py 

Es scheint Python kann nicht meine Pakete sehen, und ich bekomme eine Fehler:

Traceback (most recent call last): 
    File "./Package2/file2_3.py", line 1, in <module> 
    from Package2.file2_1 import * 
ImportError: No module named 'Package2' 

Was ist der Grund?

EDIT: Wenn in der Import Linie I from file2_1.py import * ohne Paketnamen verwenden, unterstreicht die IDE den Import als "Ungelöste Referenz Package2" (obwohl es laufen kann), und das Terminal funktioniert ...

+0

Können Sie eine 'which python' in pycharm Terminal und das gleiche in Windows-Terminal? auch check in pycharm terminal 'import sys' und 'sys.path' und das selbe in windows-terminal um zu prüfen, ob es irgendwelche unterschiede gibt – lapinkoira

Antwort

2

Das Problem ist, dass die Art und Weise, auf die Sie das Programm ausführen, falsch ist., PyCharm ist sich bewusst, wie Python-Submodule behandelt werden und führt die Datei korrekt aus.

Wenn Sie ein Paket package1 mit einem Modul haben package1.my_module Sie dies mit der -m Schalter ausgeführt werden soll:

python -m package1.my_module 

Sie nicht laufen sie direkt:

python package1/my_module.py <-- NO! Incorrect 

auch: Sie sollten laufen die Datei von außerhalb das Paket. Also, wenn Ihr Projekt ist:

MyProject 
    | 
    +- package1 
    | | 
    | +- file1.py 
    | 
    +- package2 
     | 
     +- file2.py 

Ihr Arbeitsverzeichnis MyProject sein sollte.

Mein persönlicher Rat: nie Submodule direkt laufen lassen. Stattdessen legen Sie den Code in ein separates Skript, das außerhalb des Pakets ist.Also würde ich habe:

MyProject 
    | 
    +- package1 
    | | 
    | +- file1.py 
    | 
    +- package2 
    | | 
    | +- file2.py 
    | 
    +- scripts 
     | 
     +- script1.py 

Wo script1.py die Module importiert er braucht:

from package1 import file1 
from package2 import file2 

# code 

Dann können Sie das Skript aus Ihrem MyProject Verzeichnis ausführen:

python scripts/script1.py 

Wenn Sie möchten, Implementieren Sie Ihren Code, den Sie eine setup.py Skripte schreiben, die package1 und package2 als Pakete hinzufügen, während script1.py als ein Skript und sie werden in den richtigen Verzeichnissen installiert, so dass Sie package1 und package2 von überall importieren und script1.py von überall ausführen können.

+0

yay, es hat funktioniert. danke für diese umfassende antwort, geschätzt! – Fidd

Verwandte Themen