CMD command aus Python 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.
Antworten
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Hallo Leute,

wiedermal eine vermutlich einfach zu beantwortende Frage: Ich möchte aus meinem Python Script ein DOS- Shell command ausführen:

In einer batch Datei/ bzw. direkt in der cmd Shell würde ich etwa so etwas schreiben:

D:\xyz\gsrec -start 0x12154 -end 0x12200 -o output.s19 input.abs

Diesen Aufruf möchte ich nun direkt aus Python machen... Wie realisiert man das?

Danke für eure Hilfe!

MFG

Killigen
BlackJack

@Killigen:Dafür gibt es das `subprocess`-Modul.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Killigen hat geschrieben:Wie realisiert man das?
Schau' Dir mal das subprocess Modul an.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Traceback (most recent call last):
File "C:\LegacyApp\Python27_huge\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 323, in RunScript
debugger.run(codeObject, __main__.__dict__, start_stepping=0)
File "C:\LegacyApp\Python27_huge\Lib\site-packages\pythonwin\pywin\debugger\__init__.py", line 60, in run
_GetCurrentDebugger().run(cmd, globals,locals, start_stepping)
File "C:\LegacyApp\Python27_huge\Lib\site-packages\pythonwin\pywin\debugger\debugger.py", line 655, in run
exec cmd in globals, locals
File "C:\Users\nerbp\Desktop\NVRAM_init\Neuer_Algo\NVRAM_init.py", line 39, in <module>
import subprocess
File "C:\LegacyApp\Python27_huge\lib\subprocess.py", line 537, in check_call
retcode = call(*popenargs, **kwargs)
File "C:\LegacyApp\Python27_huge\lib\subprocess.py", line 524, in call
return Popen(*popenargs, **kwargs).wait()
File "C:\LegacyApp\Python27_huge\lib\subprocess.py", line 711, in __init__
errread, errwrite)
File "C:\LegacyApp\Python27_huge\lib\subprocess.py", line 948, in _execute_child
startupinfo)
WindowsError: [Error 2] Das System kann die angegebene Datei nicht finden

Ich vermute es fehlt irendeine lib!? Wenn ja welche? Woher bekomm ich die und wo muss sie hin?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Killigen
Ich vermute, der Fehler liegt im Aufruf, nicht in einem fehlenden Modul. Schick' doch mal den Code, der diesen Fehler provoziert.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Code: Alles auswählen


#Folgener Code soll diesen Aufruf in der command shell machen:
#D:\xyz\gsrec -start 0x12154 -end 0x12200 -o output.s19 input.abs


import subprocess

start_adr   = "0x12154"
end_adr     = "0x12200"

subprocess.call(['D:\xyz\gsrec','-start 0x12154','-end 0x12200','-o','output.s19 input.abs'])

Hab das Ganze jetzt auf meinen Anwendungsfall zugeschnitten.

Jetzt bekomme ich folgende Meldung:

Traceback (most recent call last):
File "C:\LegacyApp\Python27_huge\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 312, in RunScript
codeObject = compile(code, script, "exec")
ValueError: invalid \x escape

Außerdem soll statt dem Hexstring nach start und nach end die Variable und kein fixer wert stehen...
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Killigen
  1. Argumente gehören gesondert übergeben:

    Code: Alles auswählen

    ['-start', '0x12154', '-end', '0x12200', '-o', 'output.s19', 'input.abs']
  2. Die Fehlermeldung und auch das Syntaxhighlighting sagen es ja schon: Ein String, der mit einem Backslash beginnt, wird als escape sequence behandelt:

    Code: Alles auswählen

    >>> print '\xc3\xa4'
    ä
    >>> print '\\xc3\\xa4'
    \xc3\xa4
    Wenn Du also einen Backslash darstellen möchtest, dann musst Du ihn escapen, d. h. ebenfalls mit einem vorangestellten Backslash markieren.
  3. Um einen Dateinamen samt Pfadangabe darzustellen, würde ich os.path verwenden. Damit ersparst Du Dir solche Überraschungen.
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Okay das mit den escapes war wirklich ein dämlicher Fehler :D
Das mit os.path setze ich später um...

Habe es jetzt wie folgt geändert:

Code: Alles auswählen

#Folgener Code soll diesen Aufruf in der command shell machen:
#D:\xyz\gsrec -start 0x12154 -end 0x12200 -o output.s19 input.abs


import subprocess

start_adr   = "0x12154"
end_adr     = "0x12200"

subprocess.call(['D:\\xyz\\gsrec', '-start', start_adr, '-end', end_adr, '-o', 'output.s19', 'input.abs'])
Jetzt bekomme ich folgenden Fehler:

Traceback (most recent call last):
File "C:\LegacyApp\Python27_huge\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 323, in RunScript
debugger.run(codeObject, __main__.__dict__, start_stepping=0)
File "C:\LegacyApp\Python27_huge\Lib\site-packages\pythonwin\pywin\debugger\__init__.py", line 60, in run
_GetCurrentDebugger().run(cmd, globals,locals, start_stepping)
File "C:\LegacyApp\Python27_huge\Lib\site-packages\pythonwin\pywin\debugger\debugger.py", line 655, in run
exec cmd in globals, locals
File "C:\Users\nerbp\Desktop\Test.py", line 5, in <module>
import subprocess
File "C:\LegacyApp\Python27_huge\lib\subprocess.py", line 524, in call
return Popen(*popenargs, **kwargs).wait()
File "C:\LegacyApp\Python27_huge\lib\subprocess.py", line 711, in __init__
errread, errwrite)
File "C:\LegacyApp\Python27_huge\lib\subprocess.py", line 948, in _execute_child
startupinfo)
WindowsError: [Error 2] Das System kann die angegebene Datei nicht finden

Und hier bin ich wieder der Meinung dass eine Lib fehlt...!?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Killigen: und liegt im Verzeichnis D:\xyz eine Datei namens gsrec.exe? Und kannst Du das Kommando so in der Eingabeaufforderung ausführen?
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Oh je... Ja das ist das Problem :D
Meine Güte das ist peinlich... :oops:
Problem gelöst... Danke euch! :)
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Hätte jetzt doch noch eine Frage und zwar möchte ich nun folgendes machen:

subprocess.call(['%ts_local%\\gh\\mpc.2013.5.4\\gsrec', '-start', start_adr, '-end', end_adr, '-o', s19_dump, abs_input])

Ich möchte also zwar einen absoluten Pfad angeben allerdings mit einer path variable... hier %ts_local% jedoch erhalte ich wieder folgenden Fehler:

Traceback (most recent call last):
File "..\..\..\Tools\NVRAM\NVRAM_init.py", line 606, in <module>
subprocess.call(['%ts_local%\\gh\\mpc.2013.5.4\\gsrec', '-start', start_adr, '-end', end_adr, '-o', s19_dump, abs_input])
File "D:\ts_mirr\Python27\lib\subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File "D:\ts_mirr\Python27\lib\subprocess.py", line 679, in __init__
errread, errwrite)
File "D:\ts_mirr\Python27\lib\subprocess.py", line 896, in _execute_child
startupinfo)
WindowsError: [Error 2] Das System kann die angegebene Datei nicht finden

Erkennt jemand den Fehler?
BlackJack

@Killigen: Diese Variablen werden wenn Du das auf der Kommandozeile ausführst von der Shell ersetzt bevor das tatsächlich ausgeführt wird. Eine Shell verwendest Du hier nicht sondern startest das Programm direkt. Also musst Du auch Umgebungsvariablen selber ersetzen/einsetzen. Werte von Umgebungsvariablen bekommt man über `os.environ` beziehungsweise `os.getenv()`.
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Okay... das heist ich muss folgendes machen:

Code: Alles auswählen

exe_path = os.getenv("ts_local") + "\\gh\\mpc.2013.5.4\\gsrec"

subprocess.call([exe_path, '-start', start_adr, '-end', end_adr, '-o', s19_dump, abs_input])
Stimmt das so bzw. könntest du mir eine verbesserte Version sagen?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Killigen & BlackJack: dafür gibt es sogar eine Funktion:

Code: Alles auswählen

exe_path = os.path.expandvars('%ts_local%\\gh\\mpc.2013.5.4\\gsrec')
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Super! Danke ;) Funktioniert nun...
Antworten