Seite 1 von 1

CMD command aus Python ausführen

Verfasst: Dienstag 19. Mai 2015, 14:11
von Killigen
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

Re: CMD command aus Python ausfürhen

Verfasst: Dienstag 19. Mai 2015, 14:17
von BlackJack
@Killigen:Dafür gibt es das `subprocess`-Modul.

Re: CMD command aus Python ausfürhen

Verfasst: Dienstag 19. Mai 2015, 14:20
von mutetella
Killigen hat geschrieben:Wie realisiert man das?
Schau' Dir mal das subprocess Modul an.

mutetella

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 08:57
von Killigen
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?

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 09:01
von mutetella
@Killigen
Ich vermute, der Fehler liegt im Aufruf, nicht in einem fehlenden Modul. Schick' doch mal den Code, der diesen Fehler provoziert.

mutetella

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 09:29
von Killigen

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...

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 09:43
von mutetella
@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

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 09:51
von Killigen
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...!?

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 09:54
von Sirius3
@Killigen: und liegt im Verzeichnis D:\xyz eine Datei namens gsrec.exe? Und kannst Du das Kommando so in der Eingabeaufforderung ausführen?

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 10:41
von Killigen
Oh je... Ja das ist das Problem :D
Meine Güte das ist peinlich... :oops:
Problem gelöst... Danke euch! :)

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 14:34
von Killigen
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?

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 14:57
von 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()`.

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 15:03
von Killigen
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?

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 15:09
von Sirius3
@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')

Re: CMD command aus Python ausführen

Verfasst: Mittwoch 20. Mai 2015, 15:35
von Killigen
Super! Danke ;) Funktioniert nun...