2016-03-19 7 views
0

Ich habe ein setup.py Skript für eine GUI-Anwendung und ein Runner-Skript myapp erstellt. Der Läufer Skript enthält:Warum wird das Python-Modul ohne seine Funktionen importiert?

#!/usr/bin/env python3 

import myapp 
myapp.gui_mode() 

Die Anwendung kann mit python3 myapp.py Hier von der Kommandozeile ausgeführt werden, wie myapp.py aussieht:

#!/usr/bin/evn python3 

def gui_mode(): 
    run_app() 

def main(): 
    print("Starting UI") 
    gui_mode() 

if __name__ == '__main__': 
    main() 

Nachdem ich die App mit sudo python3 setup.py install und attemp installieren, um sie auszuführen von Konsole mit myapp erhalte ich die folgende Nachricht: AttributeError: module 'myapp' has no attribute 'gui_mode'

Ok, beginne ich python3 Dolmetscher und überprüfen:

import myapp 
print(dir(myapp)) 
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__'] 

Ich frage mich, warum myapp ohne eigene Funktionen eingeführt zu werden?

UPDATE

In [4]: print(myapp.__file__) 
/home/tastyminerals/dev/NEFI2/nefi2/__init__.py 

Hier ist die Struktur Projekt:

APP2/ 
    setup.py 
     myapp/myapp.py 
     myapp/bin/run_myapp <-- renamed runner file 
     myapp/__init__.py 
     myapp/data 

Kritische Teil setup.py:

packages=['myapp'], 

    scripts=[ 
     'myapp/bin/run_myapp' 
    ], 

Antwort

1

Wenn Sie das myapp.py importieren, das Sie hier gezeigt haben, wird es gui_mode und main Attribute haben. Ich vermute, dass Sie das Modul myapp.py, das Sie laden möchten, nicht laden. Überprüfen Sie den Wert myapp.__file__, um zu sehen, welche Datei Sie tatsächlich geladen haben.

+0

Es wird als '__init __. Py' geladen, das leer ist. – minerals

1

Der Läufer Skript myapp benannt ist und das Modul davon abhängen s on heißt auch myapp. Haben Sie vielleicht auch das Paket myapp benannt? Etwas installiert mit setup.py hat einen Basispaketnamen, also nehme ich an, dass Sie wahrscheinlich das Paket myapp auch genannt haben, also müssten Sie myapp.myapp importieren (oder myapp.py in das Paket umbenennen, um __init__.py, also das Paket fungiert wie ein Modul der gleicher Name).

Es ist eine schlechte Idee, solche Namen auf jeden Fall zu überlappen; Wenn das Runner-Skript selbst den Namen myapp.py hat, importiert es sich selbst vor dem installierten myapp Paket; Python durchsucht das lokale Verzeichnis zuerst, weshalb es eine schlechte Idee ist, Ihre Skriptnamen mit Python-integrierten Modulen zu benennen (z. B. kein Skript math.py oder Sie können import math Anweisungen für andere Skripte im selben Verzeichnis vermasseln).

+0

Ich habe das Runner-Skript umbenannt, leider ohne Erfolg. – minerals

Verwandte Themen