[Tutor] help with erros using subprocess module

Jerome Jabson jjabson at yahoo.com
Thu May 11 19:59:19 CEST 2006


Hi Bo,

Thank you very much for all your help!! But I'm having
some problems with the line of code you recommended:

   if isinstance(cmd, types.StringTypes):
      cmd = cmd.split(' ')

I'm getting the following error:

NameError: global name 'types' is not defined

As you instructed, I put in the beginning of the
functon proc:

def proc(cmd_in):
   cmd = cmd_in
   if isinstance(cmd, types.StringTypes):
      cmd = cmd.split(' ')
   os.chdir("/home/qauser/jerome")
   outFile = os.path.join(os.curdir, "output.log")
   outptr = file(outFile, "w")
   errFile = os.path.join(os.curdir, "error.log")
   errptr = file(errFile, "w")
   retval = subprocess.call(cmd, 0, None, None,
outptr, errptr)
   errptr.close()
   outptr.close()
   if not retval == 0:
      errptr = file(errFile, "r")
      errData = errptr.read()
      errptr.close()
      raise Exception("Error executing command: " +
repr(errData))

Am I missing some module you are referencing with
"types"?

Thanks again,
Jerome


>I think I find what is wrong here !
>
>First , I run the program in windows , and it execute
>well without any 
>error and execption .
>Second , I run it in Linux and the error you provide
>occured .
>
>And then I debug the script in Linux , and found that
>below :
>The subprocess.call method pass its arguments to the
>Popen object and 
>then the later fork the process , in the python
>library reference I
>found that :
>
>args should be a string, or a sequence of program
>arguments. The 
>program 
>to execute is normally the first item in the args
>sequence or string, 
>but can be explicitly set by using the executable
>argument.
>
>
>If the first argument is a string , then the Popen
>class assume it is 
>only the command without arguments , and if the first
>argument is a 
>sequence , the Popen class
>assume that the first elment in the sequence is a
>command name and 
>others else are arguments for the command .
>So , if you want to pass arguments to your shell ,
you >must pass the 
>call method a sequence instead of a command .
>I add a clause in the begin of the function proc :
>
>if isinstance( cmd , types.StringTypes):
>cmd = cmd.split(' ')
>
>and everything is OK !
>
>And I also there is a function called
>list2cmdline(args) , which will 
>be 
>called in the windows version of Popen , and it is
>this function make 
>the program through in windows with no error .

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 


More information about the Tutor mailing list