ich bin neu im Forum und auch noch nicht so lange mit Python vertraut. Habe mich damit beschäftigt, wg. Hoock-Scripts für SVN. Benutze entsprechend Py 23 auf Win2K.
Ich habe versucht svnperms.py zu benutzen. Da kam ein Fehler mit der Funktion getstatusoutput. Habe dann über Foren rausgefunden, dass man die Fkt ersetzen muss für Win2K mit pipe = os.popen(cmdstr + '2>&1')
output = pipe.readlines()
status = pipe.close()
was ich dann auch gemacht habe. Kein Fehler mehr zumindest nicht an der stelle.
Um der Sache auf dem Grund zu gehen habe ich in einem kleinen Script die Stelle nachgebildet
Wenn ich diesen Script dann laufen lasse bekomme ich nur
Svnlook changed e:\svn\extranet –r 1
Als Ausgabe
Wenn ich aber dieser Befehl selber im Kommando-Fenster ausfühere, habe ich die Liste der Verzeichnisse und Dateien die sich geändert bzw dazugekommen sind wie erwartet.
Wieso ist nichts in der Output Variable vom Script ?
Jens hat folgendes geschrieben Der komplette cmd-String sieht wohl so aus:
"svnlook changed e:\svn\extranet -r 12>&1"
Tut mir leid, aber es läuft nicht. Habe nach dem 1 ein Blank reingemacht, dann getestet mit
cmdstr = "svnlook changed e:\svn\extranet -r 1 2>&1"
pipe = os.popen(cmdstr)
um sicher zu gehen dass der string so umgesetzt wird wie ich es auch sehe. Und dann nochmal ohne blank zwischen 1 und 2.
Immer das selbe Ergebnis: keine Verzeichnis/Dateinamen Liste.
Ich tipp mal darauf das die Umleitung auch eigentlich von der shell gemacht wird und das os.popen keine shell benutzt. Somit mußt du wirklich stderr lesen. Oder aber du nimmst einfach popen4: http://docs.python.org/lib/os-newstreams.html#l2h-1556
Ich würde das mit subprocess machen. Das kann man auch leicht von Python 2.4 nach Python 2.3 "backporten". Im Grunde mußt du nur subprocess.py von Python 2.4 zu deinem Skript kopieren und fertig. Dann kannst du es normal benutzten, als wenn du Python 2.4 hast
Ich starte einen Test-Import um mein pre-commit-check.py zu testen un komme raus mit Fehler beim subprocess.py im _execute_child:
E:\SVN>svn import c:\Temp\Testf7.txt svn://servername/test/stamm/Testf7.txt -m
CommitTest
Hinzufügen C:\Temp\Testf7.txt
svn: 'pre-commit' Aktion scheiterte mit dem Fehler:
Traceback (most recent call last):
File "E:\svn\hook\pre-commit-check.py", line 166, in ?
sys.exit(core.run_app(main, sys.argv[1], sys.argv[2]))
File "C:\Python23\svn\core.py", line 217, in run_app
return apply(func, (_core.application_pool,) + args, kw)
File "E:\svn\hook\pre-commit-check.py", line 125, in main
retval, retstring = _execcmd (cmdString)
File "E:\svn\hook\pre-commit-check.py", line 84, in _execcmd
process = subprocess.Popen(cmdstr, stdout=PIPE, stderr=PIPE)
File "C:\Python23\Lib\site-packages\subprocess.py", line 547, in __init__
errread, errwrite)
File "C:\Python23\Lib\site-packages\subprocess.py", line 701, in _execute_chil
d
startupinfo)
WindowsError: [Errno 193] %1 ist keine zul?\228ssige Win32-Anwendung
in _execcmd:
.../...
process = subprocess.Popen(cmdstr, stdout=PIPE, stderr=PIPE)
.../...
da der svnperms.py selber auch einen subprocess öffnet, habe ich erstmal der aufruf der Groß/Klein schreibung vorzuziehen und zu sehen ob das klappt. Leider auch nicht:
E:\SVN>svn import c:\Temp\Testf7.txt svn://servername/test/stamm/Testf7.txt -m
ImportTest
Hinzufügen C:\Temp\Testf7.txt
svn: 'pre-commit' Aktion scheiterte mit dem Fehler:
Traceback (most recent call last):
File "E:\svn\hook\pre-commit-check.py", line 169, in ?
sys.exit(core.run_app(main, sys.argv[1], sys.argv[2]))
File "C:\Python23\svn\core.py", line 217, in run_app
return apply(func, (_core.application_pool,) + args, kw)
File "E:\svn\hook\pre-commit-check.py", line 125, in main
retval, retstring = _execcmd (cmdCCI + ' ' + repos_dir + ' ' + txn)
File "E:\svn\hook\pre-commit-check.py", line 85, in _execcmd
process = subprocess.Popen(cmdstr, stdout=PIPE, stderr=PIPE)
File "C:\Python23\Lib\site-packages\subprocess.py", line 547, in __init__
errread, errwrite)
File "C:\Python23\Lib\site-packages\subprocess.py", line 701, in _execute_chil
d
startupinfo)
WindowsError: [Errno 193] %1 ist keine zul?\228ssige Win32-Anwendung
und die _execcmd ist auch vom aufruf der subprocess Funktion gleich wie oben beschrieben.
Ich schätze mal dass - entweder kann man kein python Script von einem anderem über die subprocess Funktion aufrufen,
oder ich einen Denkfehler gemacht habe.
Im worst-case, musste ich aus den Python-scripte Klassen bauen damit ich sie importieren kann und auf die einzelnen Funktionen zugreiffen kann
aber damit habe ich bis jetzt noch keine Erfahrungen.
Das problem ist auch das ich wenig Zeit von meinem Chef um das ganze zum laufen zu bringen bekommen habe...
also brauche ich eher schnelle Lösungen.
Mania hat geschrieben:WindowsError: [Errno 193] %1 ist keine zul?\228ssige Win32-Anwendung
Da stimmt wohl was mit dem Aufruf nicht... Ist es überhaupt möglich das du direkt ein Python-Skript auf der Konsole starten kannst oder mußt du den Python-Interpreter starten (der hoffentlich im Pfad ist)
Also geht: c:\>MeinSkript.py
oder geht: c:\>python.exe MeinSkript.py
???
Aber generell ist es immer besser, wenn du das andere Skript importiert und direkt auf die Methoden zugreifst... Ich meine mit subprocess ist das ganze schon sehr umständlich gelöst!
Ich kann direkt von der Console den script starten. Ich brauche nicht den Interpreter zu starten.
In dem pre-commit-check.py habe ich ausgaben in einer Log datei von den Parametern. Hier ein Auszug
"Repos " E:/SVN/test
"Txn "9-1
Wed Mar 22 16:44:17 2006: Begin pre-commit-check.py:
Wed Mar 22 16:44:17 2006: repos.svn_repos_fs:
Wed Mar 22 16:44:17 2006: repos.ChangeCollector:
Wed Mar 22 16:44:17 2006: e:\SVN\hook\svnperms.py -r E:/SVN/test -t 9-1 -f e:\SVN\svnperms.conf:
Der Aufruf von svnperms.py habe ich bis jetzt nur mit den Test Funktionen gestartet also : svnperms.py -r e:\svn\test -A UserName -R 1
Das hat auch funktionniert
Da der Pfad anders geschrieben ist in beiden Fällen habe ich gerade folgendes gemacht:
E:\SVN\hook>svnperms.py -r e:\svn\test -A username2 -R 1 -f e:\SVN\svnperms.conf
error: you don't have enough permissions for this transaction:
you can't add develop/
you can't add stamm/
you can't add version/
E:\SVN\hook>svnperms.py -r e:/svn/test -A username2 -R 1 -f e:\SVN\svnperms.conf
error: you don't have enough permissions for this transaction:
you can't add develop/
you can't add stamm/
you can't add version/
E:\SVN\hook>
Wie du siehst, funktionnieren beiden schreibweisen, also kann es daran auch nicht liegen.
Tja, da kann ich dir leider nicht mehr weiter helfen... Du müßtes schon mehr Sourcecode zeigen, damit man das Problem eingrenzen kann... Aber wie gesagt, mit subprocess ist das IMHO der falsche Weg...