mikrocontroller.net

Forum: PC-Programmierung Python Code aus mehreren Dateien zusammenfügen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Philipp C. (e61_phil) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe ein paar einfache Scripte welche Messgeräte kalibrieren. Dabei 
habe ich eine Klasse erstellt, die die Messdaten einheitlich erfasst und 
mit einem einheitlichem Format in eine Datei schreibt.

Übrig bleiben dennoch endlos viele Zeilen für die einzelnen 
Kalibrierpunkte, zu denen jeweils das Messgerät wie auch der Kalibrator 
konfiguriert werden müssen. Dies lässt sich meines Erachtens nach nicht 
mehr sinnvoll viel weiter zusammenfassen.

Ein solcher Kalibrierpunkt sieht dann z.B. so aus:

##############
## 100mV DC
##############
hp3458A.write("DCV")
hp3458A.write("NPLC 100")
hp3458A.write("RANGE 0.1")

f5730A.write("OUT 0.1V, 0Hz")
f5730A.write("OPER")
cal_value = float(f5730A.query("ADJOUT?").split(",")[0])
cal_unc   = float(f5730A.query("UNCERT?").split(",")[0])
time.sleep(settling_time)
cal.meas("100mV", cal_value, cal_unc)
f5730A.write("STBY")


cal.meas() fügt dem Messprotokoll den Kalibrierpunkt hinzu. Dem 
Konstruktor der Klasse wird eine Funktion übergeben, wie Daten aus dem 
Messgerät zu lesen sind. Der Rest ist leider sehr gerätespezifisch und 
vor allem auch Kalibrierpunkt abhängig.

Um die Datei ein wenig kleiner zu halten und die Übersicht zu erhöhen 
würde ich gerne an der Stelle, an der die lange List mit Anweisungen 
steht andere Dateien direkt in das Script importieren, die dann zB in 
Messfunktionen aufgeteilt sind. Z.B. so:


.. Code um alles zu initialisieren usw..
import("HP3458A_F5730A_DCV.py")
import("HP3458A_F5730A_DCI.py")
import("HP3458A_F5730A_ACV.py")
import("HP3458A_F5730A_ACI.py")
import("HP3458A_F5730A_OHM.py")


Das normale Pythonn import fügt ja aber die Funktionen usw in einem 
neuen Namensraum ein. Ich möchte an dieser Stelle im Prinzip 1:1 die 
Zeilen aus den anderen Dateien in meine Datei reinkopiert haben. So, 
dass auch alle Objekte weiter nutzbar sind usw.

Zudem könnte man dann auch sehr leicht einen ganzen Block 
auskommentieren, wenn man Beispielsweise nur eine dieser Messfunktionen 
kalibrieren möchte.

Ich hoffe ich konnte irgendwie ausdrücken worum es mir geht. Hat jemand 
eine Idee, wie man so etwas machen sollte?
Ggf. gibt es aber ohnehin einen viel schöneren Weg.

Vielen Dank und viele Grüße
Philipp

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
import * from

Autor: imonbln (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp C. schrieb:
> Ein solcher Kalibrierpunkt sieht dann z.B. so aus:
>
> ##############
> ## 100mV DC
> ##############
> hp3458A.write("DCV")
> hp3458A.write("NPLC 100")
> hp3458A.write("RANGE 0.1")
>
> f5730A.write("OUT 0.1V, 0Hz")
> f5730A.write("OPER")
> cal_value = float(f5730A.query("ADJOUT?").split(",")[0])
> cal_unc   = float(f5730A.query("UNCERT?").split(",")[0])
> time.sleep(settling_time)
> cal.meas("100mV", cal_value, cal_unc)
> f5730A.write("STBY")

Das Ganze sieht aber noch ziemlich lowlevel und wenig OOP mäßig aus. Die 
Ganzen writes hätte ich in irgendwelchen Klassen mit Sanity Check 
vermutet zum Beispiel beim hp3458A Objekt warum gibt es hier keine 
hp3458A.setmode(DC, 100mV) oder ähnliches, vielleicht kannst Du 
wenigsten die Einstellungen in eine Config schreiben und dann sowas 
machen
with open('hp3458A_dc_100mV.cfg') as hpin:
   for line in hpin:
      hp3458A.write(line)

das f5730A Objekt sieht auch noch so aus als hätte es Verbesserung 
Potential, die letzte Zeile mit den "STBY" könnte auf einen Context 
Manager hinweisen.
Oder aber wieder auf eine Komplexe Klasse welche die Messung macht und 
das Cal Objekt dabei Konsumiert. Insgesamt ist es aber schwierig aus 
denn paar Zeilen Optimierung raus zu lesen, vielleicht wären ein paar 
weiter Konfigurationen schon zu sehen um sich ein paar elegante Klassen 
zu überlegen.

Philipp C. schrieb:
> Um die Datei ein wenig kleiner zu halten und die Übersicht zu erhöhen
> würde ich gerne an der Stelle, an der die lange List mit Anweisungen
> steht andere Dateien direkt in das Script importieren, die dann zB in
> Messfunktionen aufgeteilt sind. Z.B. so:

Dazu solltest du wahrscheinlich dein Code in ein oder mehre Pythonmodule 
verwandeln. dann geht das mit ein simplen
import hp3458A

Autor: Philipp C. (e61_phil) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> import * from

Das gibt bei mir einen Syntaxfehler. Ich habe es dann mit
from filename import *
probiert, aber auch das brachte nicht den gewünschten Erfolg.


Zum Test habe ich folgendes gemacht:
main.py:
a = 25
import * from import_file
print(a)


und import_file.py:
print(a)
a=37


Wenn ich nun die main.py ausführe wünsche ich mir folgende Ausgabe:
25
37


imonbln schrieb:
> Das Ganze sieht aber noch ziemlich lowlevel und wenig OOP mäßig aus. Die
> Ganzen writes hätte ich in irgendwelchen Klassen mit Sanity Check
> vermutet zum Beispiel beim hp3458A Objekt warum gibt es hier keine
> hp3458A.setmode(DC, 100mV) oder ähnliches, vielleicht kannst Du
> wenigsten die Einstellungen in eine Config schreiben

Der Teil ist auch direkt die Ansprache der Geräte. Hier wollte ich 
eigentlich keine weiteren Klassen bauen, weil ich da fast alles 1:1 
reinschreiben müsste. Bei vielen Messbereichen gibt es Spezialitäten. 
Wenn schon eine Klasse, dann wäre es zB nett direkt ein "Multimeter" zu 
abstrahieren, aber da sind die Unterschiede einfach recht groß.

Bei dem einfachen Beispiel mit DCV ließe sich das sicher noch gut 
machen, aber spätestens bei der Widerstandsmessung konfiguriert man je 
nach Messbereich doch einiges um.

Und eine Config pro Kalibrierpunkt finde ich auch noch viel. Dazu 
braucht es dann ja auch noch die Config für den Kalibrator und ggf. 
unterschiedliche Wartezeiten bis man mit der Messerei anfängt.

Die Klasse (cal) macht aktuell rein gar nichts mit der Hardware und 
kümmert sich nur um eine einheitliche Ablage der Daten.

Und wenn ich für jede Spezialfunktion einen Methode einer Klasse 
aufrufen muss, dann wird es auch nicht übersichtlicher und imho sogar 
schlechter lesbar für die Leute, die zwar die Geräte kennen, aber meine 
Klassen nicht.

Ein stumpfes inkludieren von Dateien fände ich hier immer noch schön.

Vielen Dank für Eure Beiträge!

: Bearbeitet durch User
Autor: Philipp C. (e61_phil) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe noch etwas weiter gegoogled und auf den ersten Blick sieht dies 
hier nach dem aus, was ich haben möchte:

main.py:
a = 25
exec(open("import_file.py").read())
print("ich bin main", a)

import_file.py:
print("ich bin importiert", a)
a=37

liefert:
ich bin importiert 25
ich bin main 37

Autor: M.K. B. (mkbit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Include bei Python funktioniert nicht wie bei C durch ein einfaches 
Einfügen des Codes.

In Python müsstest du es so machen.
Im Import File legst du eine Funktion mit deinen Kommandos an. Am Anfang 
der Main importierst du dein Import File und die Funktion rufst du dann 
an der gewünschten Stelle auf.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.