This is baffling me.
I have a python script that does some work on a Windows platform to generate an XML file, download some images and then call an external console application to generate a video using the xml and images the python script has generated.
The application I call with pOPen is supposed to return a status i.e. [success] or [invalid] or [fail] dependant on how it interprets the data I pass it.
If I use my generation script to generate the information and then call the console application separately in another script it works fine and I get success and a video is generated.
Successful code (please ignore the test prints!):
print ("running console app...") cmd = '"C:/Program Files/PropertyVideos/propertyvideos.console.exe" -xml data/feed2820712.xml -mpeg -q normal' print (cmd) p = subprocess.Popen(cmd , stdout=subprocess.PIPE, stderr=subprocess.PIPE) output = p.communicate()[0] print ("\n----\n[" + output + "]\n----\n") if output == "[success]": print "\nHURRAHHHHH!!!!!!!" print ("finished...") But if I include the same code at the end of the script that generates the info to feed the console application then it runs for about 2 seconds and output = []
Same code, just ran at the end of a different script...
EDIT: Thanks to Dave, Dgrant and ThomasK it seems to be that the generate script is not closing the file as redirecting strerr to stdout shows:
Unhandled Exception: System.IO.IOException: The process cannot access the file ' C:\videos\data\feed2820712.xml' because it is being used by another process. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, I nt32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions o ptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) However I AM closing the file: Extract from the generation script:
xmlfileObj.write('</FeedSettings>\n') # write the last line xmlfileObj.close # sleep to allow files to close time.sleep(10) # NOW GENERATE THE VIDEO print ("initialising video...") cmd = '"C:/Program Files/PropertyVideos/propertyvideos.console.exe" -xml data/feed2820712.xml -mpeg -q normal' print (cmd) p = subprocess.Popen(cmd , stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output = p.communicate()[0] print ("\n----\n[" + output + "]\n----\n") if output == "[success]": print "\nHURRAHHHHH!!!!!!!" print ("finished...") Any help would be appreciated.
shell=True, or to break your command up into a list of arguments.subprocess.STDOUT.