Python 23 in Win2K - os.popen (cmdstr + "2>&1')

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Mania
User
Beiträge: 7
Registriert: Montag 20. März 2006, 11:07
Wohnort: Hennef

Montag 20. März 2006, 11:25

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 20. März 2006, 11:31

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 :lol:

IMHO ist es besser direkt stderr zu lesen...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Mania
User
Beiträge: 7
Registriert: Montag 20. März 2006, 11:07
Wohnort: Hennef

Montag 20. März 2006, 11:53

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 20. März 2006, 11:59

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 :wink:

Wie das dann geht, steht im Wiki unter http://wiki.python.de/Neue_Features#Subprocess

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Mania
User
Beiträge: 7
Registriert: Montag 20. März 2006, 11:07
Wohnort: Hennef

Montag 20. März 2006, 15:05

Hi Jens,

danke hat geklappt.

Gruß

Mania
Mania
User
Beiträge: 7
Registriert: Montag 20. März 2006, 11:07
Wohnort: Hennef

Donnerstag 23. März 2006, 09:28

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 23. März 2006, 09:39

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!

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Mania
User
Beiträge: 7
Registriert: Montag 20. März 2006, 11:07
Wohnort: Hennef

Donnerstag 23. März 2006, 10:01

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 23. März 2006, 10:59

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten