[GRASS-dev] usage of subprocess.call

Glynn Clements glynn at gclements.plus.com
Wed Jul 13 05:14:02 EDT 2011


António Rocha wrote:

> Greetings
> 
> In a Python script I'm using this to run an external BIN:
> p=subprocess.call(command) where command is my command to run the bin. p 
> will be equal tot he return values of the bin.
> (so far so good)
> But I'm getting an error now while running bin:
>  File "C:/EIS/scripts/mycopy", line 577, in
> <module>
>    main()
>  File "C:/EIS/scripts/mycopy", line 278, in main
>    p=subprocess.call(command)
>  File "C:\EIS\Python25\lib\subprocess.py", line 444, in
> call
>    return Popen(*popenargs, **kwargs).wait()
>  File "C:\EIS\Python25\lib\subprocess.py", line 594, in
> __init__
>    errread, errwrite)
>  File "C:\EIS\Python25\lib\subprocess.py", line 816, in
> _execute_child
>    startupinfo)
> WindowsError: [Error 193]
> 
> My problem is not the error but, is there a way to "get" the error and 
> stop the process in a more smoother way instead of stopping so drastically?

According to MSDN:

	http://msdn.microsoft.com/en-us/library/ms681382%28v=vs.85%29.aspx

	ERROR_BAD_EXE_FORMAT	%1 is not a valid Win32 application.
	193 (0xC1) 

Note that if you want to run something other than a binary executable,
you have to use pass shell=True to subprocess.call.

As for catching the exception, use e.g.:

	try:
	    p = subprocess.call(...)
	    ...
	except OSError, e:
	    # deal with exception

WindowsError is a subclass of OSError; catching OSError will be more
portable. If you need to catch "all" errors, use StandardError, which
is the base class of "real" errors (it doesn't include non-error
exceptions such as Warning, StopIteration, SystemExit, etc).

-- 
Glynn Clements <glynn at gclements.plus.com>


More information about the grass-dev mailing list