From 25b6a8b90a87cdcb3b98d3bada9938c3a0644a76 Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Mon, 20 May 2024 19:13:39 +0300 Subject: [PATCH] Run kernel with launcher --- assembly/zip/install.py | 19 +++++++++---------- assembly/zip/kernel.json | 8 +++----- assembly/zip/launcher.py | 21 +++++++++++++++++++++ assembly/zip/zip.xml | 6 +++++- 4 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 assembly/zip/launcher.py diff --git a/assembly/zip/install.py b/assembly/zip/install.py index 16d9be0..7de7f0d 100644 --- a/assembly/zip/install.py +++ b/assembly/zip/install.py @@ -169,24 +169,23 @@ def __call__(self, parser, namespace, value, option_string=None): replace=args.replace ) - # Connect the self referencing token left in the kernel.json to point to it's install location. - - # Prepare the token replacement string which should be properly escaped for use in a JSON string + # Prepare token replacement strings which should be properly escaped for use in a JSON string # The [1:-1] trims the first and last " json.dumps adds for strings. - install_dest_json_fragment = json.dumps(install_dest)[1:-1] + executable_path = json.dumps(sys.executable)[1:-1] + launcher_path = json.dumps(os.path.join(install_dest, 'launcher.py'))[1:-1] + kernel_path = json.dumps(os.path.join(install_dest, '${project.build.finalName}.jar'))[1:-1] # Prepare the paths to the installed kernel.json and the one bundled with this installer. local_kernel_json_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'java', 'kernel.json') installed_kernel_json_path = os.path.join(install_dest, 'kernel.json') - # Replace the @KERNEL_INSTALL_DIRECTORY@ token with the path to where the kernel was installed - # in the installed kernel.json from the local template. + # Replace tokens in the installed kernel.json. with open(local_kernel_json_path, 'r') as template_kernel_json_file: template_kernel_json_contents = template_kernel_json_file.read() - kernel_json_contents = template_kernel_json_contents.replace( - '@KERNEL_INSTALL_DIRECTORY@', - install_dest_json_fragment - ) + kernel_json_contents = template_kernel_json_contents.replace('@PY_EXECUTABLE@', executable_path) + kernel_json_contents = kernel_json_contents.replace('@LAUNCHER_PATH@', launcher_path) + kernel_json_contents = kernel_json_contents.replace('@KERNEL_PATH@', kernel_path) + print(kernel_json_contents) kernel_json_json_contents = json.loads(kernel_json_contents) kernel_env = kernel_json_json_contents.setdefault('env', {}) for k, v in args.env.items(): diff --git a/assembly/zip/kernel.json b/assembly/zip/kernel.json index c3de95c..25a4843 100644 --- a/assembly/zip/kernel.json +++ b/assembly/zip/kernel.json @@ -1,10 +1,8 @@ { "argv": [ - "java", - "--add-opens", - "jdk.jshell/jdk.jshell=ALL-UNNAMED", - "-jar", - "@KERNEL_INSTALL_DIRECTORY@/${project.build.finalName}.jar", + "@PY_EXECUTABLE@", + "@LAUNCHER_PATH@", + "@KERNEL_PATH@", "{connection_file}" ], "display_name": "Java", diff --git a/assembly/zip/launcher.py b/assembly/zip/launcher.py new file mode 100644 index 0000000..024de7d --- /dev/null +++ b/assembly/zip/launcher.py @@ -0,0 +1,21 @@ +import sys +import os +import subprocess + + +def launch_kernel(): + kernel_path = sys.argv[1] + connection_file = sys.argv[2] + jvm_options = os.getenv('JJ_JVM_OPTS', '') + + subprocess.run(['java', + jvm_options, + '--add-opens', + 'jdk.jshell/jdk.jshell=ALL-UNNAMED', + '-jar', + kernel_path, + connection_file]) + + +if __name__ == '__main__': + launch_kernel() diff --git a/assembly/zip/zip.xml b/assembly/zip/zip.xml index 460bca6..7d95453 100644 --- a/assembly/zip/zip.xml +++ b/assembly/zip/zip.xml @@ -11,14 +11,18 @@ ${project.build.directory}/${project.build.finalName}.jar java + + assembly/zip/launcher.py + java + assembly/zip/kernel.json java - true assembly/zip/install.py / + true