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
CMD command aus Python ausführen
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
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?
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?
@Killigen
Ich vermute, der Fehler liegt im Aufruf, nicht in einem fehlenden Modul. Schick' doch mal den Code, der diesen Fehler provoziert.
mutetella
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 )
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'])
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...
@Killigen
- Argumente gehören gesondert übergeben:
Code: Alles auswählen
['-start', '0x12154', '-end', '0x12200', '-o', 'output.s19', 'input.abs']
- Die Fehlermeldung und auch das Syntaxhighlighting sagen es ja schon: Ein String, der mit einem Backslash beginnt, wird als escape sequence behandelt:Wenn Du also einen Backslash darstellen möchtest, dann musst Du ihn escapen, d. h. ebenfalls mit einem vorangestellten Backslash markieren.
Code: Alles auswählen
>>> print '\xc3\xa4' ä >>> print '\\xc3\\xa4' \xc3\xa4
- Um einen Dateinamen samt Pfadangabe darzustellen, würde ich os.path verwenden. Damit ersparst Du Dir solche Überraschungen.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
Okay das mit den escapes war wirklich ein dämlicher Fehler
Das mit os.path setze ich später um...
Habe es jetzt wie folgt geändert:
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...!?
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'])
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...!?
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?
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?
@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()`.
Okay... das heist ich muss folgendes machen:
Stimmt das so bzw. könntest du mir eine verbesserte Version sagen?
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])
@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')