termux-packages/packages/texlive-installer/pythontex.diff

232 lines
13 KiB
Diff

--- ./texmf-dist/scripts/pythontex/pythontex3.py.orig 2021-06-29 21:49:58.517383332 +0200
+++ ./texmf-dist/scripts/pythontex/pythontex3.py 2021-06-29 21:58:43.769382956 +0200
@@ -57,13 +57,19 @@
from collections import defaultdict, OrderedDict, namedtuple
from re import match, sub, search
import subprocess
-import multiprocessing
from pygments.styles import get_all_styles
from pythontex_engines import *
import textwrap
import platform
import itertools
+try:
+ import multiprocessing.synchronize # noqa: F401
+ from multiprocessing import Pool
+except ImportError:
+ multiprocessing = False
+
+
if sys.version_info[0] == 2:
try:
import cPickle as pickle
@@ -192,8 +198,9 @@
temp_data['hashdependencies'] = False
if args.jobs is None:
try:
- jobs = multiprocessing.cpu_count()
+ jobs = os.cpu_count()
except NotImplementedError:
+ # Is this exception needed with os.cpu_count?
jobs = 1
temp_data['jobs'] = jobs
else:
@@ -1145,6 +1152,13 @@
+def eval_task(fun_name, arg_list):
+ '''
+ Some platforms, like android, does not support multiprocessing. For such
+ platforms we fall back to this function when running tasks.
+ '''
+ arg_tuple = tuple(arg_list)
+ return eval(fun_name)(*arg_tuple)
def do_multiprocessing(data, temp_data, old_data, engine_dict):
jobname = data['jobname']
@@ -1269,7 +1283,14 @@
# concurrent processes to a user-specified value for jobs. If the user
# has not specified a value, then it will be None, and
# multiprocessing.Pool() will use cpu_count().
- pool = multiprocessing.Pool(jobs)
+ if multiprocessing:
+ pool = Pool(jobs)
+ # Add task to list of tasks to run asynchronously, from function
+ # name and list of args.
+ # globals()[fun] converts string with function name into function handle
+ async_or_eval = lambda fun, args: pool.apply_async(globals()[fun], args)
+ else:
+ async_or_eval = eval_task
tasks = []
# If verbose, print a list of processes
@@ -1284,39 +1305,39 @@
family = key.split('#')[0]
# Uncomment the following for debugging, and comment out what follows
'''run_code(encoding, outputdir,
- workingdir,
- cc_dict_begin[family],
- code_dict[key],
- cc_dict_end[family],
- engine_dict[family].language,
- engine_dict[family].commands,
- engine_dict[family].created,
- engine_dict[family].extension,
- makestderr, stderrfilename,
- code_index_dict[key],
- engine_dict[family].errors,
- engine_dict[family].warnings,
- engine_dict[family].linenumbers,
- engine_dict[family].lookbehind,
- keeptemps, hashdependencies,
- pygments_settings]))'''
- tasks.append(pool.apply_async(run_code, [encoding, outputdir,
- workingdir,
- cc_dict_begin[family],
- code_dict[key],
- cc_dict_end[family],
- engine_dict[family].language,
- engine_dict[family].commands,
- engine_dict[family].created,
- engine_dict[family].extension,
- makestderr, stderrfilename,
- code_index_dict[key],
- engine_dict[family].errors,
- engine_dict[family].warnings,
- engine_dict[family].linenumbers,
- engine_dict[family].lookbehind,
- keeptemps, hashdependencies,
- pygments_settings]))
+ workingdir,
+ cc_dict_begin[family],
+ code_dict[key],
+ cc_dict_end[family],
+ engine_dict[family].language,
+ engine_dict[family].commands,
+ engine_dict[family].created,
+ engine_dict[family].extension,
+ makestderr, stderrfilename,
+ code_index_dict[key],
+ engine_dict[family].errors,
+ engine_dict[family].warnings,
+ engine_dict[family].linenumbers,
+ engine_dict[family].lookbehind,
+ keeptemps, hashdependencies,
+ pygments_settings)'''
+ tasks.append(async_or_eval('run_code', [encoding, outputdir,
+ workingdir,
+ cc_dict_begin[family],
+ code_dict[key],
+ cc_dict_end[family],
+ engine_dict[family].language,
+ engine_dict[family].commands,
+ engine_dict[family].created,
+ engine_dict[family].extension,
+ makestderr, stderrfilename,
+ code_index_dict[key],
+ engine_dict[family].errors,
+ engine_dict[family].warnings,
+ engine_dict[family].linenumbers,
+ engine_dict[family].lookbehind,
+ keeptemps, hashdependencies,
+ pygments_settings]))
if verbose:
print(' - Code process ' + key.replace('#', ':'))
@@ -1324,35 +1345,23 @@
for key in cons_dict:
family = key.split('#')[0]
if engine_dict[family].language.startswith('python'):
- if family in pygments_settings:
- # Uncomment the following for debugging
- '''python_console(jobname, encoding, outputdir, workingdir,
- fvextfile, pygments_settings[family],
- cc_dict_begin[family], cons_dict[key],
- cc_dict_end[family], engine_dict[family].startup,
- engine_dict[family].banner,
- engine_dict[family].filename)'''
- tasks.append(pool.apply_async(python_console, [jobname, encoding,
- outputdir, workingdir,
- fvextfile,
- pygments_settings[family],
- cc_dict_begin[family],
- cons_dict[key],
- cc_dict_end[family],
- engine_dict[family].startup,
- engine_dict[family].banner,
- engine_dict[family].filename]))
- else:
- tasks.append(pool.apply_async(python_console, [jobname, encoding,
- outputdir, workingdir,
- fvextfile,
- None,
- cc_dict_begin[family],
- cons_dict[key],
- cc_dict_end[family],
- engine_dict[family].startup,
- engine_dict[family].banner,
- engine_dict[family].filename]))
+ # Uncomment the following for debugging
+ '''python_console(jobname, encoding, outputdir, workingdir,
+ fvextfile, pygments_settings[family],
+ cc_dict_begin[family], cons_dict[key],
+ cc_dict_end[family], engine_dict[family].startup,
+ engine_dict[family].banner,
+ engine_dict[family].filename)'''
+ tasks.append(async_or_eval('python_console', [jobname, encoding,
+ outputdir, workingdir,
+ fvextfile,
+ pygments_settings[family] if family in pygments_settings else None,
+ cc_dict_begin[family],
+ cons_dict[key],
+ cc_dict_end[family],
+ engine_dict[family].startup,
+ engine_dict[family].banner,
+ engine_dict[family].filename]))
else:
print('* PythonTeX error')
print(' Currently, non-Python consoles are not supported')
@@ -1365,18 +1374,19 @@
# Uncomment the following for debugging
# do_pygments(encoding, outputdir, fvextfile, pygments_list,
# pygments_settings, typeset_cache, hashdependencies)
- tasks.append(pool.apply_async(do_pygments, [encoding, outputdir,
- fvextfile,
- pygments_list,
- pygments_settings,
- typeset_cache,
- hashdependencies]))
+ tasks.append(async_or_eval('do_pygments', [encoding, outputdir,
+ fvextfile,
+ pygments_list,
+ pygments_settings,
+ typeset_cache,
+ hashdependencies]))
if verbose:
print(' - Pygments process')
# Execute the processes
- pool.close()
- pool.join()
+ if multiprocessing:
+ pool.close()
+ pool.join()
# Get the outputs of processes
# Get the files and macros created. Get the number of errors and warnings
@@ -1387,7 +1397,11 @@
new_files = False
messages = []
for task in tasks:
- result = task.get()
+ if multiprocessing:
+ result = task.get()
+ else:
+ result = task
+
if result['process'] == 'code':
key = result['key']
files[key].extend(result['files'])