Handle compile_srv() being run in a non-GUI thread

This commit is contained in:
Kovid Goyal 2023-07-12 21:08:05 +05:30
parent d594981038
commit b8ea550a76
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -230,6 +230,18 @@ def forked_compile():
stdout.close() stdout.close()
def run_forked_compile(data, options):
from calibre.debug import run_calibre_debug
p = run_calibre_debug('-c', 'from calibre.utils.rapydscript import *; forked_compile()',
json.dumps(options), stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stdout = p.communicate(as_bytes(data))[0]
if p.wait() != 0:
raise SystemExit(p.returncode)
idx = stdout.find(OUTPUT_SENTINEL)
result = as_unicode(stdout[idx+len(OUTPUT_SENTINEL):])
return result
def compile_pyj( def compile_pyj(
data, data,
filename='<stdin>', filename='<stdin>',
@ -249,17 +261,16 @@ def compile_pyj(
'js_version': js_version, 'js_version': js_version,
} }
if not ok_to_import_webengine(): if not ok_to_import_webengine():
from calibre.debug import run_calibre_debug result = run_forked_compile(data, options)
p = run_calibre_debug('-c', 'from calibre.utils.rapydscript import *; forked_compile()',
json.dumps(options), stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stdout = p.communicate(as_bytes(data))[0]
if p.wait() != 0:
raise SystemExit(p.returncode)
idx = stdout.find(OUTPUT_SENTINEL)
result = as_unicode(stdout[idx+len(OUTPUT_SENTINEL):])
else: else:
try:
c = compiler() c = compiler()
result = c(data, options) result = c(data, options)
except RuntimeError as err:
if 'Cannot use Qt in non GUI thread' in str(err):
result = run_forked_compile(data, options)
else:
raise
return result return result