Seite 1 von 1
Python 23 in Win2K - os.popen (cmdstr + "2>&1')
Verfasst: Montag 20. März 2006, 11:25
von Mania
Hallo Zusammen,
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
Code: Alles auswählen
def main():
try:
cmdstr = "svnlook changed e:\svn\extranet -r 1"
# auskommentiert: status, output = commands.getstatusoutput(cmdstr)
pipe = os.popen(cmdstr + '2>&1')
output = pipe.readlines()
status = pipe.close()
if status != 0:
sys.stderr.write(cmdstr)
sys.stderr.write("\n")
sys.stderr.write(output)
raise Error, "command failed: %s\n%s" % (cmdstr, output)
print cmdstr + "\n"
print output
except :
#sys.stderr.write("error: %s\n" % str(e))
sys.exit(1)
if __name__ == "__main__":
main()
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 ?
Vielen Dank für Ihre mithilfe.
Gruß
Mania
Re: Python 23 in Win2K - os.popen (cmdstr + "2>&
Verfasst: Montag 20. März 2006, 11:31
von jens
Mania hat geschrieben:Code: Alles auswählen
cmdstr = "svnlook changed e:\svn\extranet -r 1"
pipe = os.popen(cmdstr + '2>&1')
Der komplette cmd-String sieht wohl so aus:
"svnlook changed e:\svn\extranet -r 12>&1"
Es fehlt da also ein Leerzeichen
IMHO ist es besser direkt stderr zu lesen...
Verfasst: Montag 20. März 2006, 11:53
von Mania
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.
Gruß
Mania
Verfasst: Montag 20. März 2006, 11:59
von jens
Naja, hätte ja sein können
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
Wie das dann geht, steht im Wiki unter
http://wiki.python.de/Neue_Features#Subprocess
Verfasst: Montag 20. März 2006, 15:05
von Mania
Hi Jens,
danke hat geklappt.
Gruß
Mania
Verfasst: Donnerstag 23. März 2006, 09:28
von Mania
Hallo Jens,
ich habe noch ein Problem mit subprocess:
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 mein pre-commit-check.py:
cmdString = 'e:\SVN\hook\svnperms.py -r ' + repos_dir+ ' -t ' + txn + ' -f ' + confname
LogInfo (cmdString)
retval, retstring = _execcmd (cmdString)
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
in mein pre-commit-check.py:
cmdCCI='e:\SVN\hook\check-case-insensitive.py'
retval, retstring = _execcmd (cmdCCI + ' ' + repos_dir + ' ' + txn)
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.
Vielen Dank für eine Antwort
Mania
Verfasst: Donnerstag 23. März 2006, 09:39
von jens
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!
Verfasst: Donnerstag 23. März 2006, 10:01
von Mania
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.
Vielen Dank und Gruß
Mania
Verfasst: Donnerstag 23. März 2006, 10:59
von jens
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...
Zum Thema import, haben wir im Wiki was:
http://wiki.python.de/Modul_Import