mirror of https://github.com/chriskiehl/Gooey.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.3 KiB
41 lines
1.3 KiB
"""
|
|
Util for talking to the client program in order to retrieve
|
|
dynamic defaults for the UI
|
|
"""
|
|
import subprocess
|
|
from json import JSONDecodeError
|
|
from subprocess import CalledProcessError
|
|
|
|
import os
|
|
|
|
from gooey.python_bindings.types import Try, Success, Failure
|
|
from gooey.python_bindings.coms import deserialize_inbound
|
|
|
|
|
|
def communicate(cmd, encoding) -> Try:
|
|
"""
|
|
Invoke the processes specified by `cmd`.
|
|
Assumes that the process speaks JSON over stdout. Non-json response
|
|
are treated as an error.
|
|
|
|
Implementation Note: I don't know why, but `Popen` is like ~5-6x faster
|
|
than `check_output`. in practice, it means waiting for ~1/10th
|
|
of a second rather than ~7/10ths of a second. A
|
|
difference which is pretty weighty when there's a
|
|
user waiting on the other end.
|
|
"""
|
|
try:
|
|
proc = subprocess.Popen(
|
|
cmd,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
env=os.environ.copy()
|
|
)
|
|
out, err = proc.communicate()
|
|
if out and proc.poll() == 0:
|
|
return Success(deserialize_inbound(out, encoding))
|
|
else:
|
|
return Failure(CalledProcessError(proc.returncode, cmd, output=out, stderr=err))
|
|
except JSONDecodeError as e:
|
|
return Failure(e)
|
|
|