Parameter aus Variablen übergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Knocky
User
Beiträge: 3
Registriert: Sonntag 20. Juni 2021, 14:11

Hallo Forum!

Vorweg muss ich erst einmal sagen:
1) Dies ist mein erster Beitrag
2) Ich bin zwar erfahren in anderen Programmiersprachen, aber in Python ein totaler Newbie :-(

Aktuell bastel' ich an einem kleinen Programm für meinen Raspberry. An diesen habe ich einen kleinen Thermodrucker angeschlossen und ich benutze "escpos" (https://github.com/python-escpos/python-escpos), um mit ihm zu drucken.

Der Drucker wird beim Start meines Programmes wie folgt initialisiert und beispielsweise genutzt:

Code: Alles auswählen

from escpos import *
drucker = printer.Usb(0x0525,0xa700)
drucker.text("Hallo Forum")
drucker.cut()
Funktioniert alles super! Nun habe ich aber mehrere dieser Drucker ... gleicher Hersteller, aber unterschiedliche Modelle. Somit ändert sich die Vendor/Model-ID, wenn ich zwischen den Druckern wechsle. Damit ich dies nicht im Programm-Code jedes Mal ändern muss, habe ich die Vendor und die Model-ID's in einer Sqlite-Datenbank hinterlegt.

Nun meine Frage bzw. mein Problem:
Wie übergebe ich im obigen Code die Parameter aus Variablen? Folgendes Beispiel was NICHT funktioniert:

Code: Alles auswählen

from escpos import *
vendor = "0x525"
model = "0xa700"
drucker = printer.Usb(vendor,model)
Ich freue mich auf Eure Tipps und bedanke mich schon mal hierfür!
Viele Grüße,
Knocky
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das eine sind strings. Das andere (funktionierende) Zahlen. Das ist auch in nahezu allen anderen Sprachen ein Unterschied.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt die Vendor und Model-IDs anzugeben, könntest Du auch einfach nach dem Drucker suchen.
Da Du sowieso schon pyusb einsetzt, steht das hier (https://github.com/walac/pyusb/blob/mas ... torial.rst) wie man das macht.

Benutze keine *-Importe, sondern importiere `printer` explizit.
Knocky
User
Beiträge: 3
Registriert: Sonntag 20. Juni 2021, 14:11

Hallo __deets__!
Vielen Dank für die schnelle Antwort. Was ein String ist, ist mir schon bekannt ;-)
Und in anderen Sprachen funktioniert das auch so ... z.B. php:

Code: Alles auswählen

$imap = '{imap.abc.de:993/imap/ssl}INBOX';
$mail = 'abc@abc.de';
$pass = 'geheim';
$inbox = imap_open($imap, $mail, $password) or die ('Verbindung fehlgeschlagen: ' . imap_last_error();
Hallo Sirius 3!
Vielen Dank für die beiden Hinweise. Den Import habe ich geändert, den Link werde ich mir jetzt mal durchlesen.
Aber mich würde dennoch interessieren, wie sowas generell unter Python gemacht werden kann!
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@Knocky:

Code: Alles auswählen

>>> int("0x525", 16)
1317
Zur Einführung (besonders wenn du schon programmieren kannst) solltest du dir das Tutorial mal angucken (und die Dokumentation zu `int`).

PHP ist schwach typisiert, d. h. dass Typen wie es passt (oder auch nicht passt) automatisch in einander umgewandelt werden. Python ist stark typisiert, weil die Python-Entwickler der Meinung sind, dass implizite Typumwandlungen zu schwer zu findenden Fehlern führen.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Knocky hat geschrieben: Sonntag 20. Juni 2021, 15:01 Hallo __deets__!
Vielen Dank für die schnelle Antwort. Was ein String ist, ist mir schon bekannt ;-)
Und in anderen Sprachen funktioniert das auch so ... z.B. php:
PHP ist eine der wenigen Sprachen, die eben genau nicht zwischen Strings und Zahlen unterscheiden. Wenn irgendwo eine Zahl gebraucht wird, aber ein String reingegeben wird, dann wird da auf Teufel komm raus versucht, etwas zahlartiges draus zu machen. Geht oft gut. Bis es das einmal nicht mehr tut, und das grosse Kopfkratzen anfaengt.

Und darum machen Python und nahezu alle anderen Sprachen das nicht. Sondern verlangen eine explizite Umwandlung. Und das beantwortet auch deine Frage:

Code: Alles auswählen

from escpos import *
vendor = 0x525
model = 0xa700
drucker = printer.Usb(vendor,model)
Das war es schon. Sternchenimporte hat Sirius3 ja schon angesprochen.
Knocky
User
Beiträge: 3
Registriert: Sonntag 20. Juni 2021, 14:11

Super!
Vielen herzlichen Dank für Eure Antworten , Erläuterungen und Vorschläge :-)
Das hat mir sehr weiter geholfen!

Viele Grüße + noch einen schönen Sonntag-Abend,
Knocky
Antworten