Mehr

Warum funktioniert dieses Python-Skript nur einmal in QGIS?

Warum funktioniert dieses Python-Skript nur einmal in QGIS?


Ich habe ein Python-Skript, um die Farbe einiger bestimmter Merkmale (Linien) mithilfe von Kategorien in einer Vektorebene zu ändern. Wenn ich das Skript in die Konsole importiere, funktioniert es beim ersten Mal über die Konsole einwandfrei. Aber (während qgis geöffnet ist), wenn ich das Skript bearbeite und die Farbe einer Kategorie in "Rot" anstelle des vorherigen "Grün" ändere und dann das Skript erneut importiere, werden die Änderungen nicht angezeigt, die Linien haben die gleiche Farbe wie früher. Hier das Skript und einige Bilder:

aus PyQt4.QtGui importieren * aus PyQt4.QtCore importieren * aus qgis.core importieren * aus qgis.utils importieren iface def change_color(): active_layer = iface.activeLayer() Pipeline = [["1", "green"],[ "2","red"], ["3","green"],["4","green"],["5","green"]] Categories=[] für Label,Farbe in Pipeline: symbol = QgsSymbolV2.defaultSymbol(active_layer.geometryType()) symbol.setColor(QColor(color)) category = QgsRendererCategoryV2(int(label), symbol, label) Categories.append(category) expression = 'id' renderer = QgsCategorizedSymbolRendererV2(expression , Kategorien) active_layer.setRendererV2(renderer) active_layer.setCacheImage(None) iface.mapCanvas().refresh() iface.legendInterface().refreshLayerSymbology(active_layer) change_color()

Nehmen wir nun zum Beispiel an, dass ich das Skript bearbeite und die Pipeline in Folgendes ändere:

Pipeline = [["1", "grün"],["2","rot"], ["3","rot"],["4","grün"],["5","rot "]]

und führen Sie das Skript erneut aus. Dann sollte es 3 rote Linien statt 1 anzeigen. Aber das tut es nicht! Ich hoffe, ich war klar genug. (Ich bin nicht einmal in der Nähe eines Entwicklers.)


Ich glaube, ich habe es gefunden. Wenn ich >>>execfile anstelle von >>>import (Name des Skripts) verwende, funktioniert es so oft ich möchte, ohne QGIS zu schließen


So starten Sie das Python-Skript automatisch neu, wenn es beendet wird oder stirbt

Nun ist es möglich, dass mein obiges Python-Skript irgendwann aus irgendeinem Grund sterben kann.

Ich denke also daran, eine Art Cron-Agent im Bash-Shell-Skript zu haben, der mein obiges Python-Skript automatisch neu starten kann, wenn es aus irgendeinem Grund beendet wird.

Ist dies möglich? Wenn ja, wie kann man solche Probleme am besten lösen?

Nachdem Sie die Datei testing.conf wie folgt erstellt haben -

Ich habe den sudo-Befehl ausgeführt, um ihn zu starten, aber ich kann nicht sehen, dass dieser Prozess mit ps ax hinterher läuft?

Hast du eine Idee, warum px ax mir nichts anzeigt? Und wie überprüfe ich, ob mein Programm läuft oder nicht?


Datentypen

Was Sie vielleicht als Datei kennen, ist in Python etwas anders.

In Windows beispielsweise kann eine Datei ein beliebiges Element sein, das vom Benutzer/Betriebssystem manipuliert, bearbeitet oder erstellt wird. Das bedeutet, dass Dateien Bilder, Textdokumente, ausführbare Dateien und Excel-Dateien und vieles mehr sein können. Die meisten Dateien werden organisiert, indem sie in einzelnen Ordnern aufbewahrt werden.

In Python wird eine Datei entweder als Text oder als Binärdatei kategorisiert, und der Unterschied zwischen den beiden Dateitypen ist wichtig.

Textdateien sind als Zeilenfolge strukturiert, wobei jede Zeile eine Folge von Zeichen enthält. Dies ist, was Sie als Code oder Syntax kennen.

Jede Zeile wird mit einem Sonderzeichen abgeschlossen, das als EOL oder . bezeichnet wird Ende der Linie Charakter. Es gibt mehrere Typen, aber der gebräuchlichste ist das Komma <,> oder das Zeilenumbruchzeichen. Es beendet die aktuelle Zeile und teilt dem Interpreten mit, dass eine neue begonnen hat.

Es kann auch ein Backslash verwendet werden, der dem Interpreter mitteilt, dass das nächste Zeichen – nach dem Schrägstrich – als neue Zeile behandelt werden soll. Dieses Zeichen ist nützlich, wenn Sie keine neue Zeile im Text selbst, sondern im Code beginnen möchten.

Eine Binärdatei ist jeder Dateityp, der keine Textdatei ist. Binärdateien können aufgrund ihrer Natur nur von einer Anwendung verarbeitet werden, die die Struktur der Datei kennt oder versteht. Mit anderen Worten, es müssen Anwendungen sein, die Binärdateien lesen und interpretieren können.


Datenbankmigrationsskript

Ich arbeite an einem in Python geschriebenen Datenbankmigrationsskript, das Daten aus einer MySQL-Datenbank nimmt und sie mit einem anderen Schema (unterschiedliche Tabellenstrukturen, verschiedene Datentypen usw.) in eine PostgreSQL-Datenbank einfügt.

Die Leistung spielt eine Rolle, da ich mit großen Datenbanken umgehen muss.

Ich verwende mysql.connector und psycopg2-Adapter, um Python-Gespräche mit den beiden Datenbanken zu führen.

Mein Problem ist, dass ich Leistung benötige, aber auch die Möglichkeit, MySQL-Daten zu ändern / zu konvertieren, bevor ich Zeilen in die neue frische Datenbank einfüge. Ich gebe Ihnen ein Beispiel, um zu zeigen, warum tatsächlich ein Interessenkonflikt besteht.

Es folgt ein Code-Schnipsel ohne Leistung Optimierung, aber zumindest, wo Transformation/Wandlung von Daten möglich war:

Wie Sie hier sehen können, habe ich die Möglichkeit, für jede aus mysql abgerufene Zeile eine if-Anweisung zu machen, um z.B. Setzen Sie den Wert eines Felds in ein anderes Feld (oder wandeln Sie den Felddatentyp um usw.). Was ich in meinem Szenario wirklich tun muss (Ausarbeitung der DB-Reihe).

Inzwischen habe ich herausgefunden, dass das Ausführen vieler Insert-Anweisungen wie oben (jede MySQL-Zeile wird separat eingefügt) ist die Aufführung töten.

Ich überlege also, zu so etwas zu wechseln, das alle Anweisungsblöcke vorbereitet und dann alles in einen Block einfügt:

Mit diesem Ansatz kann das Skript etwa 100x schneller sein! Aber das problem dabei ist, dass ich die Daten nicht weiter ausführen kann (Transformation/Conversion/Casting. ) weil alle Zeilen in ein Objekt eingefügt werden und ich es nicht mehr durchlaufen kann.


Python in der realen Welt¶

Wie stabil ist Python?¶

Sehr stabil. Seit 1991 kommen ungefähr alle 6 bis 18 Monate neue, stabile Veröffentlichungen heraus, und dies scheint wahrscheinlich so zu bleiben. Ab Version 3.9 wird Python alle 12 Monate eine neue Hauptversion ( PEP 602).

Die Entwickler geben „Bugfix“-Releases älterer Versionen heraus, sodass die Stabilität bestehender Releases nach und nach verbessert wird. Bugfix-Releases, gekennzeichnet durch eine dritte Komponente der Versionsnummer (zB 3.5.3, 3.6.2), werden aus Stabilitätsgründen verwaltet Nur Fixes für bekannte Probleme sind in einem Bugfix-Release enthalten, und es ist garantiert, dass die Schnittstellen überall gleich bleiben Reihe von Bugfix-Releases.

Die neuesten stabilen Versionen finden Sie immer auf der Python-Downloadseite. Es gibt zwei produktionsreife Versionen von Python: 2.x und 3.x. Die empfohlene Version ist 3.x, die von den meisten verbreiteten Bibliotheken unterstützt wird. Obwohl 2.x noch weit verbreitet ist, wird es nicht mehr gepflegt.

Wie viele Leute verwenden Python?¶

Es gibt wahrscheinlich Millionen von Benutzern, obwohl es schwierig ist, eine genaue Anzahl zu erhalten.

Python steht zum kostenlosen Download zur Verfügung, daher gibt es keine Verkaufszahlen, und es ist auf vielen verschiedenen Websites erhältlich und wird mit vielen Linux-Distributionen geliefert, sodass auch die Download-Statistiken nicht die ganze Geschichte erzählen.

Die Newsgroup comp.lang.python ist sehr aktiv, aber nicht alle Python-Benutzer posten in der Gruppe oder lesen sie sogar.

Wurden bedeutende Projekte in Python durchgeführt?¶

Eine Liste der Projekte, die Python verwenden, finden Sie unter https://www.python.org/about/success. Wenn Sie die Protokolle vergangener Python-Konferenzen lesen, werden Beiträge von vielen verschiedenen Unternehmen und Organisationen sichtbar.

Zu den hochkarätigen Python-Projekten gehören der Mailman-Mailinglisten-Manager und der Zope-Anwendungsserver. Mehrere Linux-Distributionen, allen voran Red Hat, haben ihre Installations- und Systemverwaltungssoftware teilweise oder vollständig in Python geschrieben. Zu den Unternehmen, die Python intern verwenden, gehören Google, Yahoo und Lucasfilm Ltd.

Welche neuen Entwicklungen werden in Zukunft für Python erwartet?¶

Siehe https://www.python.org/dev/peps/ für die Python Enhancement Proposals (PEPs). PEPs sind Designdokumente, die eine vorgeschlagene neue Funktion für Python beschreiben und eine kurze technische Spezifikation und eine Begründung enthalten. Suchen Sie nach einem PEP mit dem Titel „Python X.Y Release Schedule“, wobei X.Y eine Version ist, die noch nicht öffentlich veröffentlicht wurde.

Neue Entwicklungen werden auf der Mailingliste python-dev besprochen.

Ist es sinnvoll, inkompatible Änderungen an Python vorzuschlagen?¶

Generell nein. Es gibt bereits Millionen von Python-Codezeilen auf der ganzen Welt, sodass jede Änderung der Sprache, die mehr als einen sehr kleinen Bruchteil der bestehenden Programme ungültig macht, verpönt werden muss. Selbst wenn Sie ein Konvertierungsprogramm zur Verfügung stellen können, besteht immer noch das Problem, alle Dokumentationen zu aktualisieren, die viele Bücher über Python geschrieben haben, und wir möchten sie nicht alle auf einen Schlag ungültig machen.

Die Bereitstellung eines schrittweisen Upgrade-Pfads ist erforderlich, wenn eine Funktion geändert werden muss. PEP 5 beschreibt das Verfahren zum Einführen von abwärtsinkompatiblen Änderungen bei gleichzeitiger Minimierung von Unterbrechungen für die Benutzer.

Ist Python eine gute Sprache für Programmieranfänger?¶

Es ist immer noch üblich, Studenten mit einer prozeduralen und statisch typisierten Sprache wie Pascal, C oder einer Teilmenge von C++ oder Java zu beginnen. Schülern ist möglicherweise besser gedient, wenn sie Python als ihre erste Sprache lernen. Python hat eine sehr einfache und konsistente Syntax und eine große Standardbibliothek und vor allem ermöglicht die Verwendung von Python in einem Programmierkurs für Anfänger, sich auf wichtige Programmierkenntnisse wie Problemzerlegung und Datentypdesign zu konzentrieren. Mit Python können Schüler schnell in grundlegende Konzepte wie Schleifen und Prozeduren eingeführt werden. Wahrscheinlich können sie im ersten Kurs sogar mit benutzerdefinierten Objekten arbeiten.

Für einen Schüler, der noch nie zuvor programmiert hat, erscheint die Verwendung einer statisch typisierten Sprache unnatürlich. Es stellt eine zusätzliche Komplexität dar, die der Schüler beherrschen muss, und verlangsamt das Tempo des Kurses. Die Studenten versuchen zu lernen, wie ein Computer zu denken, Probleme zu zerlegen, konsistente Schnittstellen zu entwerfen und Daten zu kapseln. Das Erlernen einer statisch typisierten Sprache ist zwar langfristig wichtig, aber nicht unbedingt das beste Thema für die Studierenden im ersten Programmierkurs.

Viele andere Aspekte von Python machen es zu einer guten Erstsprache. Python verfügt wie Java über eine große Standardbibliothek, so dass den Studierenden schon sehr früh im Kurs Programmierprojekte zugewiesen werden können, die tun etwas. Die Zuweisungen sind nicht auf die Standard-Vierfunktions-Rechner und Check-Balancing-Programme beschränkt. Durch die Verwendung der Standardbibliothek können die Studierenden die Befriedigung gewinnen, an realistischen Anwendungen zu arbeiten, während sie die Grundlagen der Programmierung erlernen. Durch die Verwendung der Standardbibliothek lernen die Schüler auch die Wiederverwendung von Code. Auch Module von Drittanbietern wie PyGame sind hilfreich, um die Reichweite der Studenten zu erhöhen.

Der interaktive Interpreter von Python ermöglicht es den Schülern, Sprachfunktionen während der Programmierung zu testen. Sie können ein Fenster mit laufendem Interpreter beibehalten, während sie die Quelle ihres Programms in ein anderes Fenster eingeben. Wenn sie sich nicht an die Methoden für eine Liste erinnern können, können sie Folgendes tun:

Mit dem Dolmetscher ist die Dokumentation beim Programmieren nie weit von den Schülern entfernt.

Es gibt auch gute IDEs für Python. IDLE ist eine plattformübergreifende IDE für Python, die mit Tkinter in Python geschrieben wurde. PythonWin ist eine Windows-spezifische IDE. Emacs-Benutzer werden sich freuen zu erfahren, dass es für Emacs einen sehr guten Python-Modus gibt. Alle diese Programmierumgebungen bieten Syntaxhervorhebung, automatisches Einrücken und Zugriff auf den interaktiven Interpreter während der Codierung. Eine vollständige Liste der Python-Bearbeitungsumgebungen finden Sie im Python-Wiki.

Wenn Sie die Verwendung von Python im Bildungsbereich diskutieren möchten, sind Sie möglicherweise daran interessiert, der edu-sig-Mailingliste beizutreten.


Frame_change_pre-Handler funktioniert nur einmal

Ich versuche, ein Textobjekt in jedem Frame in Blender 2.75a mit dem Code aus einer vorherigen Antwort zu ändern (Wie kann ich dynamischen Text in einer Animation erstellen?). Bei meinem Skript kommt der Textwert aus der Linseneigenschaft einer Kamera, die mit Keyframes versehen ist.

Ich habe das Skript zur Blender-Datei hinzugefügt und es geändert, um den Kameraobjektivwert zu verwenden. Wenn ich auf Skript ausführen klicke und dann einen Rahmen bewege, wird das Textobjekt im 3D-Ansichtsfenster wie erwartet aktualisiert. Aber wenn ich dann einen anderen Frame verschiebe, wird er nicht aktualisiert. Es funktioniert auch nicht für Alt + A oder wenn ich eine Sequenz von Frames rendere.

Gemäß Rays Vorschlag habe ich eine Druckfunktion hinzugefügt, die den Rahmen- und Linsenwert anzeigt. Als ich das Bild hin und her bewegte, aktualisierte sich die Bildnummer, aber der Objektivwert änderte sich nur beim ersten Mal nach dem Drücken von Run Script und blieb dann in der Konsole gleich. Der Objektivwert hat sich in der Benutzeroberfläche geändert.

Ich habe versucht, Code zu löschen, um die Handler (frame_change_pre.clear()) zu löschen und Blender zu schließen und erneut zu öffnen, um alles zurückzusetzen, und das gleiche Verhalten tritt auf.

Der Vorschlag von Zeffii, die Zeile camera_lens = bpy.data.cameras['Camera'].lens in die Funktion zu verschieben, funktionierte teilweise.

Mein Verständnis des Problems jetzt (danke an alle) ist, dass das Skript, wenn es zum ersten Mal ausgeführt wird, den Handler einrichtet und die Variable mit dem Linsenwert setzt. Von diesem Punkt an führt der Handler, wenn sich der Rahmen bewegt, nur die Funktion aus und da die Variable, die den Objektivwert enthält, außerhalb der Funktion liegt, wird sie nie aktualisiert. Das Verschieben der Linsenvariablenzuweisung in die Funktion bedeutet jetzt, dass sie bei jedem Aufruf des Handlers aktualisiert wird.

Allerdings hinkt das Update nun einen Frame hinterher. d.h.:

  • Start bei Frame 1, UI und 3D-Ansicht = 16.0.
  • Wechseln Sie zu Bild 2, UI = 16,9, 3D-Ansicht = 16,0.
  • Wechseln zu Frame 3, UI = 17,8, 3D-Ansicht = 16,9.

Ich vermute, dass der Python-Handler ausgeführt wird, bevor der Keyframe-Wert berechnet wird. Ich habe versucht, zu frame_change_post zu wechseln, aber das schien auch nicht zu funktionieren. Anregungen?


Raspberry PI GPIO funktioniert nicht

Ich habe gerade ein Raspberry Pi 3 B+ Modell bekommen und habe einige Skripte geschrieben, um ein LED-Muster zu erstellen. Alles funktionierte und hörte dann plötzlich auf. Jedes Mal, wenn ich ein Python-Skript über sudo python #scriptName ausführe, stürzt die Konsole ab, was bedeutet, dass ich keinen Python-Code mehr ausführen oder den Computer herunterfahren kann, ohne den Netzstecker zu ziehen Konsolenbildschirm und es gibt kein Python-Programm, um den Kill-Befehl zu verwenden. Ohne den verbundenen Cobbler wird manchmal Code ausgeführt, aber wenn er verbunden ist, friert die Konsole ein. Auch die in der Steckplatine angeschlossene LED leuchtet schwach, ohne dass der GPIO beim Start eingeschaltet wird, und bleibt an, bis ich sie von der Konsole aus ausschalte. Habe ich etwas ausgebrannt? Kann mir bitte jemand einen Rat geben, was los ist? Mein Testskript

Hier ist ein Bild des Problems. Hier ist ein Bild von der Schaltung, die ich aufgebaut habe


2 Antworten 2

Bitte sehen Sie meine BEARBEITEN am Ende dieser Antwort.

Übersetzung: „Zu jeder 30. Minute nach jeder vollen Stunde von 16 bis 23 und 0 Uhr an jedem Wochentag von Montag bis Freitag.“

Die erste Antwort fehlt, weil sie nicht jede halbe Stunde läuft. Vielleicht könnten Sie das umgehen, indem Sie einen Schlaf in Ihren Code einfügen:

Übersetzung: „Zu Minute 0 und jede 30. Minute nach jeder Stunde von 16 bis 23 und 0 an jedem Wochentag von Montag bis Freitag.“

Die zweite Antwort fehlt, weil sie um 16:00 Uhr läuft, 30 Minuten vor dem gewünschten Startzeitpunkt. Dies ist wahrscheinlich eine "ehere" Übereinstimmung mit Ihren angegebenen Anforderungen, wenn das keine Rolle spielt. Wenn es darauf ankommt, und Sie können bis 17:00 Uhr warten, dann kümmert sich eine einfache Änderung des Zeitplans darum:

EDIT: Ich hatte eine mentale Blockade. Mir ist aufgefallen, dass es ein . gibt genau Antwort auf deine Frage. Es soll 3 crontab-Einträge statt nur 2 haben:


Kivy und APKs erstellen

Wenn Sie weiter gehen möchten, müssen Sie Kivy verwenden. Kivy bläst im Grunde die Türen weit auf, indem wir voll funktionsfähige Android-Apps mit Multi-Touch, Grafik und mehr erstellen lassen. Und so verwandeln Sie Ihre Python-Skripte auch in APKs, die Sie direkt auf Ihrem Android-Gerät installieren oder sogar über den Play Store verteilen können. Das Beste daran ist, dass Kivy auch plattformübergreifend ist, sodass Sie auf diese Weise Apps für eine Vielzahl von Plattformen erstellen können.

Jetzt können wir UI-Elemente wie Schaltflächen und Leinwände mit Grafiken anzeigen. Als Vorgeschmack, so könnte ein bisschen Code zum Anzeigen einer Schaltfläche aussehen:

Dazu müssen wir Kivy jedoch auf einem PC ausführen. Sie können über Kivy unter Windows entwickeln, aber wenn Sie APKs erstellen möchten, empfehle ich stattdessen Linux. Das Problem ist, dass das Erstellen von APKs aus Python-Skripten unter Windows immer noch ein langwieriger und komplexer Prozess ist und mehrere Bibliotheken, das Android NDK, das Festlegen von Pfaden usw. erfordert. Es ist so kompliziert, dass es fast unmöglich ist.

Glücklicherweise gibt es ein Tool namens „Buildozer“, das all die schwere Arbeit für Sie erledigen kann. Dies läuft nicht unter Windows, aber glücklicherweise ist es einfach genug, Linux über VirtualBox auf einer virtuellen Maschine zum Laufen zu bringen und dann ein Disc-Image von Kivvy herunterzuladen, das alles enthält, was Sie zum Erstellen Ihrer Apps benötigen. Lesen Sie die Datei README.txt, die mit Ihrer VM geliefert wird, und sie führt Sie durch alles, was Sie wissen müssen. Nachdem Sie die angewiesenen Befehle in das Terminal eingegeben haben, müssen Sie nur noch die Datei „buildozer.spec“ bearbeiten. Hier geben Sie Dinge wie den Namen Ihrer App, den Paketnamen und alle anderen Dateien ein, die eingeschlossen werden müssen.

Alle Details und alles, was Sie zum Download benötigen, finden Sie hier. Dies ist auch eine großartige Gelegenheit, mit Linux herumzuspielen, zusätzliche Software herunterzuladen usw. Wenn Sie Ubuntu mögen, bleiben Sie dran – ich zeige Ihnen in einem zukünftigen Beitrag, wie Sie es auf Ihrem Android-Gerät ausführen können!

Sie müssen wahrscheinlich einige Dinge aktualisieren und eine IDE (z. B. Ninja IDE) installieren und verschiedene Einstellungen ändern. Es genügt zu sagen, dass dies immer noch nicht ganz „Plug and Play“ ist und an dieser Stelle sollten Sie besser bei Android Studio und Java bleiben. Ich habe diesen Abschnitt nur eingefügt, um zu zeigen, dass es möglich ist, Apps in Python zu erstellen, wenn Sie dies wünschen. Meistens empfehle ich, bei QPython zu bleiben und es als Ort zu verwenden, um Code auszuprobieren und sich vielleicht ein paar praktische Tools zu machen.


4 Antworten 4

Dies geschieht, weil normalerweise, wenn der Prozess STDOUT zu etwas anderem als einem Terminal umgeleitet wird, die Ausgabe in einen Puffer mit betriebssystemspezifischer Größe (vielleicht 4k oder 8k in vielen Fällen) gepuffert wird. Umgekehrt wird STDOUT bei der Ausgabe an ein Terminal zeilengepuffert oder überhaupt nicht gepuffert, sodass Sie nach jedem oder für jedes Zeichen eine Ausgabe sehen.

Sie können die STDOUT-Pufferung im Allgemeinen mit dem Dienstprogramm stdbuf ändern:

Wenn Sie nun tail -F log , sollten Sie jede Zeilenausgabe sofort sehen, wenn sie generiert wird.