1. Why are you redirecting stdin/stdout/stderr? You don't seem to be using it.
2. You need to call `.Communicate()` at least once on the object returned from `.Popen()` to ensure the process is actually started. You don't need to send anything in the `Communicate` call, but you do need to call it. I had this exact problem last week in a different codebase.
3. Possibly look into [envoy](https://github.com/kennethreitz/envoy) if everything fails. It uses subprocess internally but provides a better and less error-prone API.