> When I call .communicate(), it seems to wait for process to terminate.

Peculiar. I have a ycm_extra_conf.py file at work that uses the `YcmCorePreload` API to inject a call to a binary started with subprocess. I do `popen = subprocess.Popen(path_to_binary); popen.communicate()` and it works just fine. Granted, I call a binary that's very short-lived and doesn't output any data.

Popen shouldn't be blocking the Python process, [it should be async](http://stackoverflow.com/questions/636561/how-can-i-run-an-external-command-asynchronously-from-python). If all else fails, you may need to start a Python thread and call Popen from there. [See how envoy does it](https://github.com/kennethreitz/envoy/blob/master/envoy/core.py#L55).