Mehr

So zeigen Sie die Python-Konsole beim Start des QGIS-Programms an

So zeigen Sie die Python-Konsole beim Start des QGIS-Programms an


Ich frage mich, ob es eine Möglichkeit gibt, die Python-Konsole direkt beim Programmstart zu öffnen. Es gibt eine Möglichkeit, eine Verknüpfung für die Python-Konsole festzulegen, aber ich kann eine solche Option für den Start des QGIS-Programms nicht finden.


Makros verwenden

Sie können die QGIS Python-Konsole starten beim Öffnen eines Projekts indem du ein paar Zeilen in schreibstQGIS->Projekt->Projekteigenschaften:

def openProject(): qgis qgis.utils.iface.actionShowPythonDialog().trigger() importieren

Stellen Sie sicher, dass Sie Makros für Ihr Projekt wie folgt aktivieren:Einstellungen->Optionen->Allgemein->Makros aktivieren: Immer


Verwenden von startup.py

Wie Sie möchten, dass sich die QGIS Python-Konsole öffnet beim Starten von QGIS, können Sie erstellen (falls noch nicht vorhanden) astartup.pyDatei in%APPDATA%QGISQGIS3(z. B. GNU/Linux:/home/USER/.local/share/QGIS/QGIS3/oder Windows:C:BenutzerBENUTZERAppDataRoamingQGISQGIS3) und schreibe:

qgis importieren qgis.utils.iface.actionShowPythonDialog().trigger()

BEARBEITEN (um eine Folgefrage von @Miro zu beantworten)

Wie von Miro erwähnt, wenn die QGIS Python Console geöffnet ist,qgis.utils.iface.actionShowPythonDialog().trigger()wird es schließen. Wenn wir also ein QGIS-Plugin schreiben, kann es sinnvoll sein zu wissen, ob die Python-Konsole geöffnet (sichtbar) ist oder nicht.

Sie können feststellen, ob die Python-Konsole nicht sichtbar ist (und dann öffnen), indem Sie diesen Code ausführen:

from qgis.PyQt.QtWidgets import QDockWidget pythonConsole = iface.mainWindow().findChild(QDockWidget, 'PythonConsole') if not pythonConsole oder not pythonConsole.isVisible(): from qgis.utils import iface.action().ShowPython()

Es ist wirklich einfach, einen Befehl auszugeben, um eine neue cmd.exe zu starten.

Das Flag /k leitet die anderen Befehle an cmd.exe weiter und wird ausgeführt, bis Sie die Shell selbst verlassen, was nützlich ist, wenn Sie Spuren sehen möchten.

Das Flag /C leitet die anderen Befehle an cmd.exe weiter und wird ausgeführt, bis das Python-Programm beendet ist.

In Ihrer Projektdatei sollten Sie also so etwas haben:

Wo wir gerade beim Thema build_systems in Sublime sind, möchte ich das Plugin BuildSwitcher empfehlen, es funktioniert auf ST3 einwandfrei, es merkt nur nicht immer, wenn Sie einen neuen Build in Ihrer Projektdatei hinzufügen. Dies bedeutet auch, dass Sie das Plugin für ST3 manuell installieren müssen.

Mit diesem Plugin können Sie verschiedene Builds mit nur wenigen Tastendrücken einfach definieren und ausführen. Eine echte Zeitersparnis.

Das ist eigentlich überraschend einfach, aber es hat viel gegraben, um die Teile zu verbinden. Ich habe zuerst einen Umweg über eine Batch-Datei gefunden, aber nach einigem Nachdenken habe ich alles in einem einzigen Sublime-Build-System zusammengefasst.


Dies ist in der normalen Konsole nicht möglich. iPython behält eine Kopie des Quellcodes für den Fall, dass Sie ihn später noch einmal sehen möchten, die Standard-Python-Konsole jedoch nicht.

Hätten Sie die Funktion aus einer Datei importiert, hätten Sie inspect.getsource() verwenden können:

aber, um es ausdrücklich zu sagen, inspect.getsource() schlägt für Funktionen fehl, die in der interaktiven Konsole eingegeben werden:

weil nichts im Interpreter die Eingabe behält (außer der readline-Bibliothek, die den Eingabeverlauf speichern könnte, nur nicht in einem Format, das direkt von inspect.getsource() verwendet werden kann).

Es ist ein bisschen hackisch, aber wenn Sie dies häufig tun werden, können Sie das Readline-Modul und einen Funktionsdekorator verwenden.

Sie können diese Klassen zu Ihrer PYTHONSTARTUP-Datei hinzufügen, damit Sie sie jedes Mal, wenn Sie einen Interpreter laden, verfügbar haben.


1 Antwort 1

Die Implementierung jeglicher Form des Remote-Zugriffs ist wirklich ausreichend, aber ich würde empfehlen, in jeden Prozess einen Webserver einzubauen, um die Fernsteuerung zu ermöglichen. Der Grund dafür ist zum Teil, dass es hier einfach zu verwendende standardbasierte Kommunikation ist (dh eine REST-Schnittstelle ist einfach zu implementieren, einfach aufzurufen und einfach Dienste wie Sicherheit zu bauen), aber auch, weil Sie damit eine Web-Benutzeroberfläche erstellen können auch in jeden Prozess, sodass Sie sich über einen Browser mit jedem einzelnen Prozess verbinden und eine Seite mit derselben Steuerungsfunktionalität anzeigen lassen können, die Sie als REST-API bereitstellen würden.

So können Sie jeden Prozess einzeln steuern und alle über ein übergeordnetes Steuerungsprogramm steuern.

Beachten Sie, dass Sie auch eine Form der Prozesserkennung implementieren müssen, es sei denn, Sie möchten den Speicherort jedes Prozesses manuell konfigurieren.


2 Antworten 2

Willkommen in der Gemeinschaft. Hier sind einige Hinweise aus dem ersten Blick auf den Code:

Der Code folgt nicht dem PEP-8-Styleguide. Sie sollten der Snake_case-Namenskonvention für Variablen und Funktionsklassen folgen, die der CamelCase-Namensgebung folgen.

Anstatt den Code unverändert auszuführen, sollte die Ausführungsbedingung in einem if __name__-Block platziert werden.

Für den Vergleich von True , False , None anstelle von == wird die Vergleichsprüfung bevorzugt. Anstelle von result == False wäre das Ergebnis also False oder einfach nicht result .

Wenn Sie Python 3.6+ verwenden, können Sie auch Typhinweise bereitstellen.

Verwenden Sie anstelle von Kommentaren zu den Funktionsdefinitionen Docstrings.

Die folgende(n) print-Anweisung(en) haben eine redundante Schleife (unnötige CPU-Anweisungen):

Willkommen in der Community, mein erster Post war auch ein Tictactoe, allerdings in einem funktionalen Style in Scala.

Also erst mal ein paar allgemeine Regeln/Anregungen, dann gehe ich später auf die Details ein. Wenn ich etwas falsch liege, dann korrigiere mich bitte. Ich bin erfahrener in Java und obwohl ich einige Projekte in Python gemacht habe, weiß ich vielleicht immer noch nicht, wie sich die Dinge unterscheiden.

  1. Code sollte von oben nach unten lesbar sein
  2. Versuchen Sie, so wenig wie möglich einzurücken. (Es gibt oft mehr als 5 Einzüge)
  3. Snake Case in Python also MakeListOfFreeFiels = make_list_of_free_fields
  4. Verwenden Sie aussagekräftige Variablennamen. (Ihre Schleifen sind schwer zu lesen i, j, r, s usw.)
  5. Verwenden Sie Kommentare nur bei Bedarf. Deine Namen sollten aussagekräftig genug sein

Also würde ich zuerst die Funktion play_game() erstellen, damit Sie eine saubere Oberfläche haben, um Ihr Spiel zu starten. Sie legen einfach alles, was Sie haben, unten hinein und platzieren es oben, damit es besser lesbar ist.

Ok bei der VictoryFor()-Funktion:

Das allgemeine Muster ist ziemlich interessant. Ich hätte nicht daran gedacht, wie du es algorithmisch gelöst hast.

Persönlich habe ich dies gelöst, indem ich einen Satz von Sätzen aller Gewinnmuster definiert habe und dann überprüfe, ob die Werte in diesen Indizes alle gleich sind. Ich habe ein flaches Array verwendet, Sie haben eine Karte verwendet. Wenn Sie es also implementieren möchten, müssen Sie das ändern. (Von Scala kopiert, aber die Idee ist die gleiche).

Nun zurück zu Ihrer Implementierung und einigen Vorschlägen. Sie können die Zeichenfolge in einem anderen Format darstellen. Nur etwas syntaktischer Zucker.

Um Ihre Absicht klarer zu machen, können Sie die Schleifen in separate Funktionen aufteilen. def check_hor_winner, def check_vert_winner, def check_diag_winner

Außerdem würde ich das Zeichen in Spieler umbenennen.

Wenn Sie VictoryFor so geändert haben, dass es true oder false zurückgibt, können Sie diese Ergebnisse = True und breaks entfernen und einfach True zurückgeben.

Hier ist die letzte geänderte VictoryFor-Funktion in Ihrem algorithmischen Stil. Vor allem in den Diagonalfunktionen hätte ich wahrscheinlich nur die hartcodierten Muster eingefügt, aber wenn Sie ein 100x100 ticTacToe machen würden, wäre es sinnvoll.

Als nächstes steht Ihre MakeListOfFreeFields Der Funktionsname repräsentiert nicht, was er tut. Das Erstellen einer Liste der freien Felder ist nur ein Implementierungsdetail. Was es tatsächlich tut, ist zu prüfen, ob es ein Unentschieden ist. Um dies widerzuspiegeln, benennen wir es in is_draw um, und wenn wir schon dabei sind, entfernen wir auch die globale Variable result und lassen is_draw True oder false zurückgeben.

DrawMove und EnterMove können auch in enter_move_player() und enter_move_computer umbenannt werden. Mit den Namen bin ich noch nicht ganz zufrieden, aber es ist klarer.

Hier ist das Endergebnis, das ich gemacht habe. Es sind noch viele Verbesserungen möglich, aber meine Zeit wird knapp. Ich bin für jede Kritik offen


2 Antworten 2

Zunächst einige Stilfragen. Python hat einen offiziellen Styleguide, PEP8. Es wird empfohlen, nicht mehrere Befehle in derselben Zeile zu platzieren. Außerdem sind Nachlauf überflüssig.

Schauen wir uns nun die benötigte Struktur an. Sie benötigen eine Karte, die alle Informationen zu dieser Karte enthält und eine Hand, die eine Liste von Karten in Bezug auf die Pokerregeln auswerten kann. Sie brauchen eigentlich kein Deck, wenn Sie nur eine Liste aller Karten im Deck haben und dann random.sample(cards, n_players*5) ausführen, um die Hände für alle Spieler zu erhalten, die Sie dann an die Spieler verteilen können.

Schauen wir uns also zuerst Card an, da Sie diese Klasse bereits haben. Ihre valname-Methode ist sehr ineffizient. Erstens könnte es sein, dass es mehrmals aufgerufen wird (dies scheint nicht der Fall zu sein). Aber Sie haben auch eine Kette von if s, jedoch kann immer nur eine davon wahr sein, also verwenden Sie stattdessen elif. Andernfalls müssen alle Bedingungen geprüft werden, anstatt nur alle Bedingungen bis zur ersten wahren.

Aber noch einfacher ist es, ein einfaches Tupel zu verwenden:

Die Methode __str__ ist eine magische Methode, die aufgerufen wird, wenn Sie print(card) ausführen, und __repr__ wird aufgerufen, wenn Sie card in einer interaktiven Sitzung eingeben. Mit __lt__ und __eq__ können Karten nach ihrem Wert verglichen werden, was beispielsweise von sortiert verwendet wird, wenn wir eine iterierbare Anzahl von Karten haben.

Wenn Sie die ausgefallenen Unicode-Namen für die Farben haben möchten, verwenden Sie diese einfach beim Erstellen der Karten:

Kommen wir nun zum Kern des Problems, der Bewertung der Pokerhände, für die die Hands-Klasse verantwortlich sein sollte:

Die Differenzfunktion stammt aus dem Paket more_itertools. Ein collections.Counter-Objekt ist genau das, was es sagt. Wenn Sie ihm ein Iterable übergeben, wird gezählt, wie oft jedes Objekt erscheint, und es hat einige nette Methoden wie most_common, die Tupel des Elements count zurückgeben, die absteigend nach count sortiert sind.

Jetzt, da wir das haben, wird die Hauptschleife ein bisschen einfacher:

Die Grouper-Funktion, mit der ich die Hände in Gruppen von jeweils 5 Karten aufgeteilt habe, stammt aus den itertools-Rezepten.

Ich habe mir hier nicht die Mühe gemacht, schönere Benutzereingabefunktionen zu verwenden, aber es gibt viele Beispiele auf dieser Seite, wie man es narrensicherer machen kann (und fragen Sie immer wieder, ob die gelieferte Eingabe irgendwie falsch ist).

Dieser Code dauert ungefähr 3,14 s ± 82 ms für 10.000 Runden mit 10 Spielern und ungefähr 34,4 s ± 483 ms für 100.000 Runden auf meinem Computer, ohne die Ergebnisse jeder Runde auszudrucken.


Wie werden formatierte Transaktionsinformationen in der Remix-IDE von web3.eth.getTransactionReceipt() angezeigt?

tl,dr: Remix zeigt eine formatierte Transaktionszusammenfassung für Transaktionen, die innerhalb der Remix-IDE initiiert werden. Ist es möglich, die gleiche Ausgabe für einen beliebigen Transaktions-Hash anzuzeigen?

Sorry, wenn das eine Noob-Frage ist. aber ich bin ein absoluter Neuling, der jetzt die Mastering Ethereum Buchbeispiele durcharbeitet.

Mit MetaMask als Web3-Injektor habe ich den Faucet-Vertrag am Ende dieses Beitrags mit der Remix-IDE für Ropsten bereitgestellt. Wenn ich aus der Remix-IDE die Funktion restore() aufrufe, signiere ich die Transaktion in MetaMask. und nach kurzer Zeit bekomme ich eine schön formatierte Zusammenfassung der Transaktion:

Obwohl es nicht die schönste Ausgabe ist, ist es kristallklar, dass ich die Ereignisse richtig codiert habe (Teil dieses Beispiels), da ich leicht überprüfen kann, ob die Protokolle die Adresse, mit der ich die Funktion aufgerufen habe, sowie den Betrag erfasst haben von wei zurückgezogen.

Um Ether in den Wasserhahn einzuzahlen, verwende ich jedoch die Receive-Fallback-Funktion (auf die ich nicht direkt von der Remix-IDE zugreifen kann), indem ich eine Sendetransaktion aus MetaMask initiiere. Ist es möglich, in Remix eine schön formatierte Transaktionszusammenfassung für einen beliebigen Transaktions-Hash anzuzeigen? Ich habe versucht, die web3-API zu verwenden, aber die Ausgabe ist hässlich und scheint auch die Ereignisprotokolle nicht zu decodieren (was ich letztendlich als Teil dieses Beispiels versuche zu sehen):

Wäre es als Alternative zur schönen Anzeige einer beliebigen Transaktionszusammenfassung möglich, das Tool "Low-Level-Interaktionen" in der Remix-IDE zu verwenden, um Ether mit der Fallback-Funktion zum Empfangen zu hinterlegen? Ich kann mir vorstellen, dass dies dann die formatierte Transaktionszusammenfassung auslösen würde, die angezeigt wird, wenn andere Transaktionen innerhalb der Remix-IDE initiiert werden.


Verwendung des COM-Ports

Jetzt brauchen wir ein Programm, das den COM-Port verwenden kann, um eine Verbindung zum Drucker herzustellen. Es gibt, wie gesagt, mehrere. Eine davon ist Wiederholungsgastgeber, das mit Slicer und einer guten grafischen Benutzeroberfläche geliefert wird. Ein anderer ist Ultimaker Cura, das die gleichen Kapazitäten hat, aber keine Protokollierung aller ausgetauschten Befehle enthält. Da es vielen als Slicer bekannt ist, werde ich es mir zuerst anschauen. Als dritte Option schaue ich mir an Pronterface.

VORSICHT: Nur einer Programm, das den COM-Port aktiv verwendet, kann gleichzeitig ausgeführt werden, da das erste Programm, das darauf zugreift, alle Verwendungen für den COM-Port beansprucht, bis es heruntergefahren wird.

Ultimaker Cura

Wählen Sie nach dem Starten von Ultimaker Cura Ihren Drucker aus. Viele Drucker sind inzwischen als Voreinstellungen verfügbar, importieren Sie also einfach den von Ihnen verwendeten Drucker oder erstellen Sie ein benutzerdefiniertes Profil. Momentan ist die neueste Version von Cura 4.1.0 und sieht so aus:

Nach dem Umschalten auf Monitor verbindet er sich automatisch über den COM-Port mit dem Drucker, in meinem Fall 4.

Wir testen noch einmal die Verbindung über Home und verwenden Sie dann die Eingabeaufforderung G-Code senden und bestätigen Sie die Zeilen mit Enter .

Wiederholungsgastgeber

Nachdem Sie Repetier Host zum ersten Mal ausgeführt haben, müssen Sie Ihren Drucker konfigurieren. Strg + P öffnet das Konfigurationsfenster für den Drucker. Wir müssen die Baudrate unseres Druckers kennen, also habe ich die Dokumentation meines Ender3 nachgeschlagen, die mir sagte, dass 115200 die richtige Einstellung ist. Die meisten Drucker scheinen mit dieser Einstellung zu laufen. Die anderen Registerkarten bestimmen die Geschwindigkeiten, Extruderanzahl und -grenzen sowie die Bettform. Der Rest wird dafür nicht benötigt. Meine Einstellungen für den Ender3 sind diese:

Ok, wir haben unsere Einstellungen vorgenommen und über OK gespeichert.

Jetzt drücken wir den Connect-Button auf der linken Seite des Menüs:

Es sollte sich in die blaue Schaltfläche Trennen ändern und jetzt andere Teile des Drucks anzeigen, um anzuzeigen, dass wir verbunden sind. Beachten Sie, dass am unteren Rand des Bildschirms ein Protokoll mit allen Befehlen und Austauschvorgängen angezeigt wird.

Auf der rechten Seite können wir jetzt die Registerkarte Manuelle Steuerung auswählen

Vor dem Senden von Befehlen ist es eine gute Idee, die Home-Taste zu drücken Taste. Dies dient auch als zusätzlicher Test, um zu sehen, ob der Drucker richtig angeschlossen ist. Jetzt können wir den Prompt G-Code verwenden, um unsere Befehle zu senden. Die Befehle werden in das Protokoll unten eingetragen.

Pronterface

Dies ist das erste Mal, dass ich Pronterface verwende. Das erste, was Sie tun müssen, nachdem Sie das Printrun-Paket heruntergeladen und die Pronterface-Anwendung ausgeführt haben, ist, auf Port zu drücken, dann die richtige Baudrate einzustellen (115200 scheint für viele Maschinen zu funktionieren) und auf Verbinden zu drücken.

Die GUI wird gesättigt und das richtige Protokoll zeigt viele Dinge, die in Verbindung getestet wurden. Beachten Sie, dass sich unten rechts in der GUI ein Temperaturkurvenprotokoll befindet, das für die Fehlersuche sehr praktisch sein kann, da es die Änderung über einen kurzen Zeitraum anzeigt.

Unterhalb des Protokolls finden wir die Eingabe für Befehle, und wenn wir einen Befehl senden, erhalten wir einen Protokolleintrag davon:


Verweise

Es kann vorkommen, dass Sie verwenden müssen gdb auf einem Legacy-System ohne erweiterte Python-Unterstützung. In diesem Fall können die folgenden Informationen hilfreich sein.

GDB-Makros

Mit Python wird eine Reihe von GDB-Makros verteilt, die beim Debuggen des Python-Prozesses helfen. Sie können sie installieren, indem Sie den Inhalt von . hinzufügen Sonstiges/gdbinit in den Python-Quellen zu

/.gdbinit -- oder kopieren Sie es von Subversion. Stellen Sie sicher, dass Sie die richtige Version für Ihre Python-Version verwenden, da sonst einige Funktionen nicht funktionieren.

Beachten Sie, dass die neuen GDB-Befehle, die diese Datei hinzufügt, nur dann korrekt funktionieren, wenn Debugsymbole verfügbar sind.

Beachten Sie auch, dass die Stoppbedingung für die while-Schleifen im Pystack und pystackv Routinen wurden ursprünglich für den Fall entwickelt, in dem Sie den Python-Interpreter direkt ausführen und den Interpreter nicht in einem anderen Programm ausführen (indem Sie die gemeinsam genutzte Bibliothek laden und den Interpreter manuell booten). Je nach Programm, das Sie debuggen möchten, müssen Sie also möglicherweise die While-Schleifen optimieren. Siehe zum Beispiel diesen StackOverflow-Beitrag für eine andere (vermeintliche) Stoppbedingung.

Python-Stack-Traces mit GDB-Makros abrufen

An der gdb-Eingabeaufforderung können Sie einen Python-Stack-Trace abrufen:

Alternativ können Sie zusammen mit jedem Stack-Frame eine Liste der Python-Locals abrufen:

Weitere nützliche Makros, die nicht in der gdbinit-Datei von Python enthalten sind

DebuggingWithGdb (zuletzt bearbeitet 2017-08-07 20:12:04 von MaximilianFuxjaeger )


1.1. Einbettung auf sehr hohem Niveau¶

Die einfachste Form der Einbettung von Python ist die Verwendung der sehr hohen Schnittstelle. Diese Schnittstelle soll ein Python-Skript ausführen, ohne direkt mit der Anwendung interagieren zu müssen. Dies kann beispielsweise verwendet werden, um eine Operation an einer Datei durchzuführen.

Die Funktion Py_SetProgramName() sollte vor Py_Initialize() aufgerufen werden, um den Interpreter über Pfade zu Python-Laufzeitbibliotheken zu informieren. Als nächstes wird der Python-Interpreter mit Py_Initialize() initialisiert, gefolgt von der Ausführung eines hartcodierten Python-Skripts, das Datum und Uhrzeit ausgibt. Danach beendet der Aufruf von Py_FinalizeEx() den Interpreter, gefolgt vom Programmende. In einem echten Programm möchten Sie das Python-Skript vielleicht aus einer anderen Quelle beziehen, vielleicht einer Texteditor-Routine, einer Datei oder einer Datenbank. Das Abrufen des Python-Codes aus einer Datei kann besser mit der Funktion PyRun_SimpleFile() erfolgen, die Ihnen das Zuweisen von Speicherplatz und das Laden des Dateiinhalts erspart.


Suchen Sie etwas Bestimmtes?

Wenn Sie wissen möchten, ob eine bestimmte Anwendung oder eine Bibliothek mit einer bestimmten Funktionalität in Python verfügbar ist, gibt es eine Reihe von möglichen Informationsquellen. Die Python-Website bietet einen Python-Paketindex (auch bekannt als der Käseladen, ein Verweis auf das Monty Python-Skript mit diesem Namen). Es gibt auch eine Suchseite für eine Reihe von Quellen für Python-bezogene Informationen. Wenn dies nicht gelingt, suchen Sie einfach nach einem Satz mit dem Wort "Python" und Sie erhalten möglicherweise das gewünschte Ergebnis. Wenn alles andere fehlschlägt, fragen Sie in der Python-Newsgroup nach und es besteht eine gute Chance, dass Sie jemand auf den richtigen Weg bringt.