Pythonskript bei ControlDesk NG Ausführen

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.
miriane
User
Beiträge: 17
Registriert: Mittwoch 30. Juli 2014, 14:25

Hi Leute,
hatte nicht verstanden was die Einrückung ist. Jetzt gelesen und verstanden.
Mein erste Problem ist gelöst.
Danke nochmals für die Hinweise.
Ich komme sicher mit neue Frage.
Danke nochmal.
miriane
User
Beiträge: 17
Registriert: Mittwoch 30. Juli 2014, 14:25

Hi,
ich habe insgesamt 59 Parameters(von meinem Layout) , kann ich auch nur eine Funktion (Methode) für die gesamte Parameters erstellen?
Beispiel:
def Hauptprogramm(datei, parametersetnr):
---

Danke im Voraus
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@mariane: ja, das geht. Du mußt aber eine passende Parametrisierung finden, um die Funktion übersichtlich zu halten. Mehr als 30 Zeilen sollte nämlich so eine Funktion nicht haben. Du wirst dafür wahrscheinlich Dictionaries brauchen.
miriane
User
Beiträge: 17
Registriert: Mittwoch 30. Juli 2014, 14:25

Hey,
wer sieht Fehler?

Code: Alles auswählen

datei = "D:\Miriane KM\Test_Digitalkarten dig_in_highbits\CDNG5_1\Project_001\test_dig\Value.csv"
obj = open(datei,"r")
 
Traceback (most recent call last):
  File "D:\Miriane KM\Test_Digitalkarten dig_in_highbits\CDNG5_1\Project_001\test_dig\Python Scripts\testlayout_01.py", line 25, in <module>
    obj = open(datei,"r")
IOError: [Errno 22] invalid mode ('r') or filename: 'D:\\Miriane KM\\Test_Digitalkarten dig_in_highbits\\CDNG5_1\\Project_001\test_dig\\Value.csv'
Zuletzt geändert von Hyperion am Dienstag 12. August 2014, 12:33, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Backslashes haben eine besondere Bedeutung in Strings. Vergleiche mal Zeichen für Zeichen deines Aufrufs mit dem String in der Fehlermeldung.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bitte setze Code, den Du hier postest, in die dafür vorgesehenen Tags! Das ist Dir jetzt schon mehrfach gesagt worden; so schwer kann das doch nicht sein, oder?

Direkt über Dem Eingabefeld befinden sich lauter Buttons, angefangen mit "B" (für Bold), "i", "u" usw. An 5. Stelle eben "Code" mit der Auswahlbox, für welche Sprache der sein soll. Per Default ist da Python ausgewählt. Du musst also nichts weiter machen, als da drauf zu drücken und dann Deinen Code *zwischen* die Tags zu schreiben.

z.B. so (hier mit Leerzeichen in den Tags, damit die Forumsoftware die Tags nicht erkennt und Du sie hier siehst):
[ code=python file=Untitled.py ]
def foo():
print("bin in foo")
[ /Code ]

Und so sieht das dann später aus:

Code: Alles auswählen

def foo():
    print("bin in foo")
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

miriane hat geschrieben:wer sieht Fehler?
"\t" im Code wird zu einem einzelnen Zeichen im resultierenden String und nicht zu den zwei Zeichen "\" und "t". Siehe dazu auch das Kapitel zu Strings im Tutorial. Welche speziellen Zeichen es gibt findest du bei der Beschreibung der Literale in der Tabelle mit den Escape Sequences.

Du musst hier also entweder den Backslash escapen oder einen Raw-String verwenden.
miriane
User
Beiträge: 17
Registriert: Mittwoch 30. Juli 2014, 14:25

ich gebe einfach den Pfad der CSV-Datei

datei=".....\Value.csv"
BlackJack

@miriane: Nein tust Du nicht. In dem tatsächlichen Pfad stehen irgendwie die *zwei* Zeichen ``\`` und ``t``, und da schreibst Du *ein* Zeichen, nämlich das Tabulatorzeichen, dessen Escape-Sequenz '\t' lauten:

Code: Alles auswählen

In [27]: len('a\tb')
Out[27]: 3

In [28]: print 'a\tb'
a       b

In [29]: len('a\\tb')
Out[29]: 4

In [30]: len(r'a\tb')
Out[30]: 4

In [31]: print 'a\\tb'
a\tb

In [32]: print r'a\tb'
a\tb
miriane
User
Beiträge: 17
Registriert: Mittwoch 30. Juli 2014, 14:25

habe das gefunden, aber es klappt auch leider nicht:

Code: Alles auswählen

accepted  \t is a tab character.
 Use a raw string instead:

test_file=open(r'c:\Python27\test.txt','r')or double the slashes:

test_file=open('c:\\Python27\\test.txt','r')or use forward slashes instead:

test_file=open('c:/Python27/test.txt','r') 
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und was genau bedeutet "klappt" nicht? :K
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
miriane
User
Beiträge: 17
Registriert: Mittwoch 30. Juli 2014, 14:25

Hi,
wie kann ich in diesen Code meine Datei weiter verwenden? Mit der erste Funktion wird eine Csv.datei in browser ausgewählt und ich will diese datei in den zweiten Funktion öfnen und verwenden.

Code: Alles auswählen

import os
import string

# Csv.datei per PushButton auswaehlen
def On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked(sender, button):
    """
    Syntax : On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked
    Purpose: 
    Parameters: sender, button
    """
    sender= str(sender)
    import win32ui,win32con,sys 
    fd = win32ui.CreateFileDialog(1,'','', 0,'Csv |*.csv') 
    fd.SetOFNTitle("Select CSV File") 
    if fd.DoModal() == win32con.IDCANCEL: sys.exit(1) 
    print fd.GetPathName().replace('\\','/') 
    a=fd.GetPathName().replace('\\','/') 
    return a
    #print "On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked "
    
#Skript ausfuehren, 
def On_Application_LayoutManagement_testlayout_01_Push0020Button_67_ButtonClicked(sender, button):
    """
    Syntax : On_Application_LayoutManagement_testlayout_01_Push0020Button_67_ButtonClicked
    Purpose: 
    Parameters: sender, button
    """
    sender= str(sender)
    datei=a
    namen = []
    zahlenwerte = []
    liste = []
    liste1.append('Timestep')
    index1 = liste1.index('Timestep')
    obj = open(datei,'r+')
miriane
User
Beiträge: 17
Registriert: Mittwoch 30. Juli 2014, 14:25

Hat sich erledigt, globale variable
global a.
Nächste Problem.Wenn ich keine datei auswähle und beim Klick auf abbrechen become ich auch einen Fehler.
Python error:
Traceback (most recent call last):
File "<Experiment Context>", line 15, in On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked
SystemExit: 1

Code: Alles auswählen

import os
import string

# Csv.datei per PushButton auswaehlen
def On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked(sender, button):
    """
    Syntax : On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked
    Purpose: 
    Parameters: sender, button
    """
    sender= str(sender)
    import win32ui,win32con,sys 
    fd = win32ui.CreateFileDialog(1,'','', 0,'Csv |*.csv') 
    fd.SetOFNTitle("Select CSV File") 
    if fd.DoModal() == win32con.IDCANCEL: sys.exit(1) 
    print fd.GetPathName().replace('\\','/') 
    global a
    a=fd.GetPathName().replace('\\','/') 
    return a
BlackJack

@miriane: Um Himmels willen *NEIN*! Vergiss bitte das es ``global`` überhaupt gibt. Das ist keine Lösung und total unsinnig wenn die Funktion den gewünschten Wert doch sowieso schon zurück gibt.

Die zweite Funktion muss die erste Funktion aufrufen. Der Pfad zu der Datei wird von der ersten Funktion ja zurückgegeben.

Die ”Dokumentation” bei den beiden Funktionen ist übrigens nicht so toll. Wie eine Funktion heisst hat nichts mit Syntax zu tun und braucht auch im Docstring nicht noch einmal wiederholt werden. Der Funktionsname steht doch genau da drüber, da kann man ihn auch lesen. Das was Du als Kommentar vor die Funktionen geschrieben hast, gehört in den Docstring. Und die Parameter einfach nur aufzuzählen ist im Grunde genau so unsinnig wie den Funktionamen noch mal in den Docstring zu schreiben solange da nicht eine weitere Erklärung zu den einzelnen Parametern steht, denn *dass* es sie gibt und wie sie heissen sieht man auch ohne die Aufzählung im Docstring. Da die beiden überhaupt nicht verwendet werden, könnte man das Dokumentieren auch einfach sein lassen, und Defaultwerte angeben, so dass man die Funktion auch ohne Argumente aufrufen kann. Dafür könnte man aber den Rückgabewert dokumentieren.

Der Funktionsname ist grauenvoll.

Importe gehören eigentlich an den Anfang des Moduls, damit man leichter sieht wovon ein Modul abhängig ist.

Abkürzungen bei Namen sollte man vermeiden. Hier ist zum Beispiel das `fd` sehr ungünstig, nicht nur weil man an dem Namen nicht erkennen kann was das Objekt im Programm bedeutet, sondern weil ein guter Teil von Programmierern hier sogar irregeführt wird, denn `fd` ist eine gängige Abkürzung für „file descriptor” in anderen Quelltexten. `a` ist auch nicht besser, auch wenn hier keine Verwechslungsgefahr besteht. Der Name ist aber auch überflüssig weil es nicht sinnvoll ist etwas an einen Namen zu binden, nur um den gleich in der nächsten Anweisung mit einem ``return`` zu verwenden.

Bei der Formatierung weicht der Quelltext stellenweise vom Style Guide for Python Code ab.

Code: Alles auswählen

def ask_for_csv_filename(_sender=None, _button=None):
    """Öffnet einen Dateidialog und lässt den Benutzer einen CSV-Dateinamen
    auswählen, der dann zurückgegeben wird.
    """
    dialog = win32ui.CreateFileDialog(1, flags=0, filter='Csv |*.csv')
    dialog.SetOFNTitle('Select CSV File')
    if dialog.DoModal() == win32con.IDCANCEL:
        sys.exit(1)
    return dialog.GetPathName().replace('\\', '/')
Die Ausnahme beim Abbrechen erzeugst Du ja selbst mit dem `sys.exit()`-Aufruf. Ist auch eher ungewöhnlich das man in einem Dateidialog auf Abbrechen drückt und damit den gesamten Prozess beenden will.
miriane
User
Beiträge: 17
Registriert: Mittwoch 30. Juli 2014, 14:25

@BlackJack: :)
Danke für die Hinweise.
Meine Code ist schön und auch sinvoll geworden
Die Funktion-Namen werden von ControlDesk selbst erzeugt. Ich arbeite Mit Events "Automation -Umgebung"
Danke
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

miriane hat geschrieben: Die Funktion-Namen werden von ControlDesk selbst erzeugt.
Hätte mich auch arg gewundert, wenn jemand von selbst so einen Funktionsnamen schreibt :lol:
miriane
User
Beiträge: 17
Registriert: Mittwoch 30. Juli 2014, 14:25

Von dieser Code habe auch ein Hinweis bekommen und suche nach einer anderen variante
einen Hinweis muss ich Ihnen aber geben:
Sie verwenden in Ihrem Skript (nur beim Betätigen des Cancel-Buttons)
"sys.exit(1) "
Diese Funktion bitte auf keinen Fall verwenden, damit wird der gesamte Python Interpreter beendet.

Code: Alles auswählen

def On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked(sender, button):                                                                                                                                                                     """Öffnet einen Dateidialog und lässt den Benutzer einen CSV-Dateinamen
   auswählen, der dann zurückgegeben wird. """ 
    import win32ui,win32con,sys 
    fd = win32ui.CreateFileDialog(1,'','', 0,'Csv |*.csv') 
    fd.SetOFNTitle("Select CSV File") 
    if fd.DoModal() == win32con.IDCANCEL: sys.exit(1) 
    print fd.GetPathName().replace('\\','/') 
    a=fd.GetPathName().replace('\\','/') 
    return a.
Hat bitte jemand etwas anders?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Der Hinweis ist doch recht eindeutig. Du sollst kein ``sys.exit`` verwenden, da sonst der gesamte Interpreter beendet wird. Das ist auch ein extrem unerwartetes Verhalten, wenn man bei einem Dialog auf Cancel drückt. Implementiere einfach sinnvolles Verhalten.

Ansonsten sieht der Code nach Chaos aus. Importe gehören in der Regel nicht in Funktionen, sondern in den Kopf des Moduls. Das if-Statement in Zeile 6 solltest du in zwei Zeilen aufteilen, so ist das kaum lesbar. Auch ist das a in Zeile 8 unnötig, du kannst das Ergebnis gleich mittels return zurückgeben. Auch das Ersetzten der Backslashes mit Slashes sieht falsch aus. Was möchtest du damit bezwecken?
Das Leben ist wie ein Tennisball.
Antworten