Migration to python subprocess module
Sat, 25 May 2013 10:55:19 +0000
After recent OS upgrade one of my unit tests started to fail (to be precise it started to hang). Quickly check showed me that CGI process started by os.popen() hanged. The old source code:
f = os.popen("./cgi_script.cgi > /dev/null", "w") f.write(postBody) f.flush() f.close()
As os.popen() is deprecated now (I know, it's a very old codebase that started with Python 1.5) I've moved to new subprocess module:
fNull = file("/dev/null", "w") p = subprocess.Popen("./cgi_script.cgi", shell=False, bufsize=1024, stdin = subprocess.PIPE, stdout = fNull) fw = p.stdin fw.write(postBody) fw.flush() fw.close() del p
As you can see it's more verbose now but I've eliminated shell (slightly faster operation).
Some notes found during migration:
- without "del p" process may be not terminated causing problems with DB state (CGI proces updates database and test checks this state later)
- I/O configuration is more flexible than os.popen() - you can make pipes more easily