Verständnisfrage .py auto compile .pyc

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,
    ich bin in Python noch relativ frisch und habe eine Frage. Ich habe div .py Dateien erstellt, die auch alle ihren Dienst tun. Zu den .pyc (Bytecode) Dateien habe ich gelesen, dass diese automatisch von python beim ersten Aufruf erzeugt werden. Nach einer Änderung der .py würde automatisch wieder ein .pyc Datei angelegt werden....

    Jetzt zu meiner Frage: Ich habe mir einige Klassen erstellt, die auf andere .py Dateien verweisen. Muss ich jetzt hier, damit ab dem 2. Aufruf alles aus dem Bytecode verwendet wird auf die .pyc verweisen? Ich finde aber keine einzige .pyc erstellt Datei. Müssen die im gleichen Verzeichniss liegen ? Ein "compileall" hat mir diese zwar erstellt, wenn ich jetzt aber ein Testscript mit der .pyc aufrufe kommt folgenden Fehlermeldung: ./time.pyc: Zeile 1: $'\003ó\r': Kommando nicht gefunden.

    Hab das gefühl ich hab hier Grundsätzlich was nicht verstanden...

    Danke schon mal im Voraus.

    Andy

    Einmal editiert, zuletzt von andy-meyer (17. Februar 2015 um 17:43)

  • Wenn du Anweisung aus einer anderen Python Datei verwenden willst, brauchst du diese nur "import" iren ;)

    Beispiel:

    /tmp/test.py
    [code=php]
    def Ausgabe():
    print "bla"
    [/php]

    /tmp/probieren.py
    [code=php]
    import test

    Ausgabe()
    [/php]

    Oder nur bestimmte Anweisungen:

    /tmp/probieren.py
    [code=php]
    from test import Ausgabe

    Ausgabe()
    [/php]

  • Hallo meigrafd,

    das mit dem Import ist mir vollkommen klar, jedoch sehen bei mir die Zeilen dann so aus:

    Code
    enmon = imp.load_source('enmon', '/ame/module/enmon.py')

    Zur meiner Frage: Wird jetzt beim import jedesmal neu compiled weil ich expliziet auf die .py verzweige?

    Grüße Andy

  • Nein. Wenn sich am Inhalt des Sources der Imports nichts ändert wird es nicht jedesmal neu compiliert ;)
    Das betrifft aber eben nur importiertes. Führst du "python probieren.py" aus wird probieren.py nicht compiliert, sondern eben nur das importierte test.py und das auch nur ein mal.

    Du kannst das erstellen der *.pyc auch abschalten:
    [code=php]
    import sys
    sys.dont_write_bytecode = True
    import test[/php]Oder im Shebang die Option -B hinzufügen:[code=php]#!/usr/bin/python -B
    import test[/php]Oder:[code=php]#!/usr/bin/env python -B
    import test[/php]

    Ist aber nicht zu empfehlen da das laden des Scripts bzw der Imports dann langsamer ist.

    Siehe dazu auch: https://docs.python.org/dev/whatsnew/3…ory-directories


    //EDIT: Seit es Leute wie Dich gibt die sich über jede Kleinigkeit aufregen können @ bootsmann

  • Sorry das ich mich jetzt erst wieder melde,war leider ein paar tage nicht in der nähe meines Test RPi`s. Ihr schreibt das immer beide Dateien verglichen werden,welche die neuere ist und dann eventuell compiliert wird. OK!

    Aber wo liegen diese .pyc Dateien? in dem eigentlichen verzeichniss des Programms sind diese nicht zu finden...

    Sorry das ich als wieder Frage, aber ich habe das gefühl das mein Programm die CPU zu viel beansprucht (ermittlung von mehrern Variablenwerte aus div. Textdateien). Das mag mit meinem Test-Szenario noch "wurscht" sein, aber wenn ich dieses Programm x-Fach nacheinander ausführe muss, sich doch in einer Webanwendung jetzt schon sehr bemerkbar macht.

    Grüße
    Andy

    • Offizieller Beitrag

    die pyc liegen im gleich Ordner wie die dazugehörige .py Datei. Für ein Webinterface ist das Iterieren über Textfiles auch das langsamste was man machen kann. Da ist ne DB der deutlich bessere Ansatz.

  • Hallo dbv,

    ganu das bin ich für mich garde am austesten, was schneller ist ;)
    Ich bau mir eine verteilte Hausautomatisierung auf, bei der aber jeder Raspberry autark agieren soll. Zu dem eigentlichen lesen der Variablen, gehören dann aber auch noch trigger Funtkionen, etc. Das fand ich als Dateibasierte Lösung am einfachsten zu gestalten. Jeder Pi kann auf die Variablen der anderen Zugreifen usw...

    Aber zurück zum Thema.

    Code
    root@RPi-2:/ame/test# mkdir /test
    root@RPi-2:/ame# cd test
    root@RPi-2:/test# nano time.py
    root@RPi-2:/test# chmod 777 time.py
    root@RPi-2:/test# ./time.py
    Uhrzeit: 14:22:37

    Inhalt time.py

    Python
    #!/usr/bin/python
    
    
    from time import *
    lt = localtime()
    print strftime("Uhrzeit: %H:%M:%S", lt)

    Es wird mir die Uhrzeit ausgegeben, alles OK! Im Ordner ist aber keine .pyc!

    Code
    root@RPi-2:/test# ls
    time.py
    root@RPi-2:/test#

    Irgendwie steh ich massiv aufm Schlauch ?!?

    Andy

    Einmal editiert, zuletzt von andy-meyer (20. Februar 2015 um 14:28)


  • Sorry das ich als wieder Frage, aber ich habe das gefühl das mein Programm die CPU zu viel beansprucht (ermittlung von mehrern Variablenwerte aus div. Textdateien). Das mag mit meinem Test-Szenario noch "wurscht" sein, aber wenn ich dieses Programm x-Fach nacheinander ausführe muss, sich doch in einer Webanwendung jetzt schon sehr bemerkbar macht.

    Dann poste mal deinen Code - kann man bestimmt noch was optimieren :fies:

    Aber wie dbv schon sagte wäre es besser ne echte Datenbank zu nutzen wie zB SQLite. Textdateien auszulesen ist immer langsamer


    Code
    root@RPi-2:/ame/test# mkdir /test
    root@RPi-2:/ame# cd test
    root@RPi-2:/test# nano time.py
    root@RPi-2:/test# chmod 777 time.py
    root@RPi-2:/test# ./time.py
    Uhrzeit: 14:22:37

    Inhalt time.py

    Python
    #!/usr/bin/python
    
    
    from time import *
    lt = localtime()
    print strftime("Uhrzeit: %H:%M:%S", lt)

    Es wird mir die Uhrzeit ausgegeben, alles OK! Im Ordner ist aber keine .pyc!

    Code
    root@RPi-2:/test# ls
    time.py
    root@RPi-2:/test#

    Irgendwie steh ich massiv aufm Schlauch ?!?

    Das Script selbst wird nicht compiliert sondern nur das importierte.

    Benenn time.py mal um (da es bereits ein gleichnamoges Modul gibt), erstell ein 2.Script und importier dort dann das 1.

  • Hallo meigrafd,

    Zitat

    Das Script selbst wird nicht compiliert sondern nur das importierte.

    Na endlich ist der Groschen bei mir gefallen!!!!!!!!!!!!:bravo2:
    Jetzt habe ich es verstanden und ja es wird eine .pyc erstellt:thumbs1:

    Das mit der DB hab ich mir schon gedacht, wollte nur den Grundsatz verstehen!
    Ich habe bereits ein DB-Loggin aktiv, jedoch mit einer My-SQL DB auf einem Debian Server am laufen. Die aktuellen Werte hatte ich jedoch in Textfiles, da ich bei einem Trigger (Licht an) nicht gleich ne DB Abfrage starten wollte. Werde mir aber diesbezuüglich überlegen ob nicht doch jeder Raspberry eine kleine DB-Server bekommt.

    Hab aktuell eine Windows basierte Hausautomatisierung, die ich mit mehrern Pi`s ablösen will.
    Aber das sind andere Themen ;)

    :danke_ATDE:
    Andy

  • Werde mir aber diesbezuüglich überlegen ob nicht doch jeder Raspberry eine kleine DB-Server bekommt.

    Je nachdem wie groß die Datenbank ist oder wie dessen Struktur aussieht wäre MySQL auf dem PI aber nicht unbedingt zu empfehlen. MySQL ist relativ Resourcen hungrig, verbraucht zudem permanent RAM+CPU auch wenn es grad gar nicht genutzt wird, aber auch die SD wird dadurch mehr belastet...

    Also wenns unbedingt MySQL sein muss, dann würde ich die Datenbank in den RAM auslagern und regelmäßig sichern - aber besser finde ich SQLite

    Also ich hab hier ein paar Tests gemacht bei denen SQLite besser abgeschnitten hat - schnellere Zugriffe aber auch schnellere SELECT's, und weil MySQL teilweise mit JOINs auch bis zu 90% CPU Last erzeugt kann das auch einiges anderes ausbremsen :( Also die SD kann in dem Fall dann leider ein Flaschenhals sein, jenachdem was für eine du einsetzt... Das is halt leider kein Vergleich zu einem PC mit Magnetscheiben


    Aber gut - das is hier jetzt OT ;)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!