Add args magic to provide cli-args to user program

This commit is contained in:
Ben Spoor 2017-04-13 08:09:16 +00:00
parent 17316fb7b2
commit ace4d01ca6
2 changed files with 13 additions and 4 deletions

View File

@ -2,6 +2,7 @@ from queue import Queue
from threading import Thread from threading import Thread
from ipykernel.kernelbase import Kernel from ipykernel.kernelbase import Kernel
import re
import subprocess import subprocess
import tempfile import tempfile
import os import os
@ -118,7 +119,9 @@ class CKernel(Kernel):
def _filter_magics(self, code): def _filter_magics(self, code):
magics = {'cflags': [], 'ldflags': []} magics = {'cflags': [],
'ldflags': [],
'args': []}
for line in code.splitlines(): for line in code.splitlines():
if line.startswith('//%'): if line.startswith('//%'):
@ -128,6 +131,10 @@ class CKernel(Kernel):
if key in ['ldflags', 'cflags']: if key in ['ldflags', 'cflags']:
for flag in value.split(): for flag in value.split():
magics[key] += [flag] magics[key] += [flag]
elif key == "args":
# Split arguments respecting quotes
for argument in re.findall(r'(?:[^\s,"]|"(?:\\.|[^"])*")+', value):
magics['args'] += [argument.strip('"')]
return magics return magics
@ -151,7 +158,7 @@ class CKernel(Kernel):
return {'status': 'ok', 'execution_count': self.execution_count, 'payload': [], return {'status': 'ok', 'execution_count': self.execution_count, 'payload': [],
'user_expressions': {}} 'user_expressions': {}}
p = self.create_jupyter_subprocess([self.master_path, binary_file.name]) p = self.create_jupyter_subprocess([self.master_path, binary_file.name] + magics['args'])
while p.poll() is None: while p.poll() is None:
p.write_contents() p.write_contents()
p.write_contents() p.write_contents()

View File

@ -25,5 +25,7 @@ int main(int argc, char **argv, char **envp)
fprintf(stderr, "%s: %s\n", argv[0], error); fprintf(stderr, "%s: %s\n", argv[0], error);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
return usermain(argc, argv, envp);
/* Call Users main, but make master.c invisible by removing first argument */
return usermain(argc-1, argv+1, envp);
} }