sys.argv[n] ?

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
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Ich verzweifele jetzt schon eine Stunde an der Fehlersuche. Um das alles genauer nachvollziehen zu können, hab ich jetzt auch shcon an jeder Stelle ein print drin:

ich rufe von Script a Script b auf:

Code: Alles auswählen

P_List = ["python.exe", "Indikatoren_loop_neu.py", pwd, sel_indikator[0], indikator_values,sel_ebene,ebene, land]
print P_List
os.spawnv(os.P_WAIT, PythonPath, P_List)

# Ausgabe des prints stimmt auch noch:
C:/python24/python.exe ['python.exe', 'Indikatoren_loop_neu.py', 'mysql', 'select * from indizes where 1=1  and calc_cat in (%s) and kat in (%s)', "['a', 'A']", 'select ID,AGS, Datum, AREA from ebenen where 1=1 and (DES = "Gemeinde" or DES ="kreisfreie Stadt" )  and land = "rp"', 'gemeinde', 'rp']
Dann wird auch richtig Script b aufgerufen:

Code: Alles auswählen

passwort = sys.argv[1] 
print passwort
sel_indikatoren =  sys.argv[2] 
print sel_indikatoren
i_values = sys.argv[3]
print i_values
sel_ebene = sys.argv[4] 
print sel_ebene
DES = sys.argv[5]
land = sys.argv[6]

# Ausgabe des prints:
abcde    # die Ausgabe des Passwortes erfolgt noch richtig
select    # ab hier scheint vom sys.argv[2] nur das 1. Wort genommen
*
from
Da scheint das 2. Argument scheinbar nicht als ein String erkannt, aber ich weiß einfach nicht warum. Wo liegt mein Fehler? Ist bestimmt wieder irgendwas total dummes, aber ich seh es einfach nicht.

Wenn ich die einzelnen Argumente aus P_List direkt eintrage anstelle der sys.argv[n] funktioniert das Script problemlos. Nur die Übergabe geht halt irgendwie nicht :(


EDIT: noch eine Frage zu dem os.spawnv() .... warum kann ich dort keine Listen als Argumente übergeben? Das hat mir heute auch shcon Probleme bereitet ...

EDIT 2: die ganez Problematik hat übrigens in anderen Scripten auch schon problemlos funktioniert und da hatte ich eigentlich nichts anders gemacht, als im ersten Script os.spawnv() aufgerufen, P_list mir Argumenten dort übergeben und dann im zweiten Script die Argumente mit sys.argv[n] übernommen.
Zuletzt geändert von meneliel am Montag 17. Dezember 2007, 13:32, insgesamt 1-mal geändert.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Code: Alles auswählen

P_List = ["python.exe", "Indikatoren_loop_neu.py", pwd, '"' + sel_indikator[0] + '"', indikator_values,sel_ebene,ebene, land]
Zu deutsch: Die Kommandozeilenargumente quoten.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

ahh ... okay.... für den ersten Teil funktioniert das für:

'select ID,AGS, Datum, AREA from ebenen where 1=1 and (DES = "Gemeinde" or DES ="kreisfreie Stadt" ) and land = "rp"'

allerdings nicht. Ich glaube da muss ich den String wohl auseinander nehmen, bzw. Ich könnte die "" Argumente im String in einem extra Sting übergeben, wie auch i_values.

Danke für den Tipp.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Hmpf, mir ist grade noch eingefallen: Du solltest das Subprocess Modul verwenden. Das quotet automatisch.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

... und irgendwie hab ich mit dem quoten allgemein paar Probleme *hust* ... aber hoffe das wird noch

Guck ich mir mal an das Modul. Danke.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Hab es jetzt probiert mir:

Code: Alles auswählen

from subprocess import Popen 

...

P_List = ["Indikatoren_loop_neu.py", pwd, sel_indikator[0],sel_indikator[1],sel_ebene,ebene,land]
Popen(P_List)
folgende Fehlermeldung:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
    return self.func(*args)
  File "***********\GUI_subprocess.py", line 303, in start_Calculation
    Popen(P_List)
  File "C:\python24\lib\subprocess.py", line 558, in __init__
    errread, errwrite)
  File "C:\python24\lib\subprocess.py", line 722, in _execute_child
    startupinfo)
WindowsError: [Errno 193] %1 ist keine zulässige Win32-Anwendung
Wenn ich das richtig verstehe, funktioniet das unter WIndows also nicht?


EDIT:
also hab noch bisschen rumgespielt:

Code: Alles auswählen

Popen(P_List,bufsize=0,stdin=PIPE,stderr=PIPE,stdout=PIPE, shell=True)
SO bekomme ich keine Fehlermeldung mehr, aber ich weiß auch nicht was gerade "passiert". Mit os.spanv hat sich da ein neues Fenster geöffnet und alle prints und raw_inputs des gestarteten Scripts waren da zu lesen/erfolgten da ....
Wie krieg ich das jetzt mit dem subprocess.Popen hin? WIe gesagt, ich sehr halt nicht, was gerade passiert und eigentlich müsste beim Starten des Scriptes weitere Eingabeaufforderungen kommen ...

EDIT 2:

Code: Alles auswählen

print process.stdout.read()
Damit dazu, krieg ich jetzt zwar alles ausgegeben, aber nur bis zu dem Zeitpunkt, wo eine Eingabe erfolgt ... :(
Antworten