def cythonize(source, output=None, includes=(), workdir=None): import cyautodoc from Cython.Compiler import Options from Cython.Compiler.Main import ( CompilationOptions, default_options, compile, PyrexError, ) cwd = os.getcwd() try: # compute output filenames if output is None: name, _ = os.path.splitext(source) output = name + '.c' else: name, _ = os.path.splitext(output) outputs_c = [output] outputs_h = [name + '.h', name + '_api.h'] # run Cython on source options = CompilationOptions(default_options) lang_level = Options.directive_types.get('language_level', int) options.language_level = lang_level(3) options.output_file = output options.include_path = list(includes) options.working_path = workdir or "" Options.generate_cleanup_code = 3 any_failures = 0 try: if options.working_path: os.chdir(options.working_path) result = compile(source, options) if result.num_errors > 0: any_failures = 1 except (EnvironmentError, PyrexError) as e: sys.stderr.write(str(e) + '\n') any_failures = 1 if any_failures: for out in outputs_c + outputs_h: try: os.remove(out) except OSError: pass return 1 return 0 # finally: os.chdir(cwd)
def extract(path, **kwargs): name = os.path.splitext(os.path.relpath(path))[0].replace('/', '.') options = CompilationOptions() options.include_path.append('include') options.language_level = 2 options.compiler_directives = dict( c_string_type='str', c_string_encoding='ascii', ) context = options.create_context() tree = parse_from_strings(name, open(path).read().decode('utf8'), context, **kwargs) extractor = Visitor({'file': path}) extractor.visit(tree) return extractor.events
def extract(path, **kwargs): name = os.path.splitext(os.path.relpath(path))[0].replace("/", ".") options = CompilationOptions() options.include_path.append("include") options.language_level = 2 options.compiler_directives = dict(c_string_type="str", c_string_encoding="ascii") context = options.create_context() tree = parse_from_strings( name, open(path).read(), context, level="module_pxd" if path.endswith(".pxd") else None, **kwargs) extractor = Visitor({"file": path}) extractor.visit(tree) return extractor.events
def parse_command_line(args): from Cython.Compiler.Main import \ CompilationOptions, default_options def pop_arg(): if args: return args.pop(0) else: bad_usage() def get_param(option): tail = option[2:] if tail: return tail else: return pop_arg() options = CompilationOptions(default_options) sources = [] while args: if args[0].startswith("-"): option = pop_arg() if option in ("-V", "--version"): options.show_version = 1 elif option in ("-l", "--create-listing"): options.use_listing_file = 1 elif option in ("-+", "--cplus"): options.cplus = 1 elif option.startswith("--embed"): ix = option.find('=') if ix == -1: Options.embed = "main" else: Options.embed = option[ix+1:] elif option.startswith("-I"): options.include_path.append(get_param(option)) elif option == "--include-dir": options.include_path.append(pop_arg()) elif option in ("-w", "--working"): options.working_path = pop_arg() elif option in ("-o", "--output-file"): options.output_file = pop_arg() elif option in ("-r", "--recursive"): options.recursive = 1 elif option in ("-t", "--timestamps"): options.timestamps = 1 elif option in ("-f", "--force"): options.timestamps = 0 elif option in ("-v", "--verbose"): options.verbose += 1 elif option in ("-p", "--embed-positions"): Options.embed_pos_in_docstring = 1 elif option in ("-z", "--pre-import"): Options.pre_import = pop_arg() elif option == "--cleanup": Options.generate_cleanup_code = int(pop_arg()) elif option in ("-D", "--no-docstrings"): Options.docstrings = False elif option in ("-a", "--annotate"): Options.annotate = True elif option == "--convert-range": Options.convert_range = True elif option == "--line-directives": options.emit_linenums = True elif option == "--no-c-in-traceback": options.c_line_in_traceback = False elif option == "--gdb": options.gdb_debug = True options.output_dir = os.curdir elif option == '-2': options.language_level = 2 elif option == '-3': options.language_level = 3 elif option == "--fast-fail": Options.fast_fail = True elif option in ('-Werror', '--warning-errors'): Options.warning_errors = True elif option == "--disable-function-redefinition": Options.disable_function_redefinition = True elif option == "--directive" or option.startswith('-X'): if option.startswith('-X') and option[2:].strip(): x_args = option[2:] else: x_args = pop_arg() try: options.compiler_directives = Options.parse_directive_list( x_args, relaxed_bool=True, current_settings=options.compiler_directives) except ValueError, e: sys.stderr.write("Error in compiler directive: %s\n" % e.args[0]) sys.exit(1) elif option.startswith('--debug'): option = option[2:].replace('-', '_') import DebugFlags if option in dir(DebugFlags): setattr(DebugFlags, option, True) else: sys.stderr.write("Unknown debug flag: %s\n" % option) bad_usage() elif option in ('-h', '--help'): sys.stdout.write(usage) sys.exit(0) else: sys.stderr.write("Unknown compiler flag: %s\n" % option) sys.exit(1) else: arg = pop_arg() if arg.endswith(".pyx"): sources.append(arg) elif arg.endswith(".py"): # maybe do some other stuff, but this should work for now sources.append(arg) else: sys.stderr.write( "cython: %s: Unknown filename suffix\n" % arg)
from Cython.Compiler.Main import compile_single, CompilationOptions from Cython.Compiler.TreeFragment import parse_from_strings from Cython.Compiler.Visitor import TreeVisitor from Cython.Compiler import Nodes from Cython.Compiler.AutoDocTransforms import EmbedSignature options = CompilationOptions() options.include_path.append('include') options.language_level = 2 options.compiler_directives = dict( c_string_type='str', c_string_encoding='ascii', ) ctx = options.create_context() tree = parse_from_strings('include.libavutil.avutil', open('scratchpad/test.pxd').read().decode('utf8'), ctx) class Visitor(TreeVisitor): def __init__(self, state=None): super(Visitor, self).__init__() self.state = dict(state or {}) self.events = [] def record_event(self, node, **kw): state = self.state.copy() state.update(**kw) state['pos'] = node.pos
def cythonize(source, output=None, includes=(), destdir_c=None, destdir_h=None, wdir=None): from Cython.Compiler.Main import \ CompilationOptions, default_options, \ compile, \ PyrexError from Cython.Compiler import Options cwd = os.getcwd() try: if output is None: name, _ = os.path.splitext(source) output = name + '.c' else: name, _ = os.path.splitext(output) outputs_c = [output] outputs_h = [name + '.h', name + '_api.h'] # change working directory if wdir: os.chdir(wdir) # run Cython on source options = CompilationOptions(default_options) if Options.directive_types['language_level'] is str: options.language_level = '3str' options.output_file = outputs_c[0] options.include_path = list(includes) Options.generate_cleanup_code = 3 any_failures = 0 try: result = compile(source, options) if result.num_errors > 0: any_failures = 1 except (EnvironmentError, PyrexError): e = sys.exc_info()[1] sys.stderr.write(str(e) + '\n') any_failures = 1 if any_failures: for output in outputs_c + outputs_h: try: os.remove(output) except OSError: pass return 1 # move ouputs for destdir, outputs in ( (destdir_c, outputs_c), (destdir_h, outputs_h)): if destdir is None: continue for output in outputs: dest = os.path.join( destdir, os.path.basename(output)) try: os.remove(dest) except OSError: pass os.rename(output, dest) # return 0 # finally: os.chdir(cwd)
def parse_command_line(args): from Cython.Compiler.Main import \ CompilationOptions, default_options def pop_arg(): if args: return args.pop(0) else: bad_usage() def get_param(option): tail = option[2:] if tail: return tail else: return pop_arg() options = CompilationOptions(default_options) sources = [] while args: if args[0].startswith("-"): option = pop_arg() if option in ("-V", "--version"): options.show_version = 1 elif option in ("-l", "--create-listing"): options.use_listing_file = 1 elif option in ("-+", "--cplus"): options.cplus = 1 elif option == "--embed": Options.embed = "main" elif option.startswith("--embed="): Options.embed = option[8:] elif option.startswith("-I"): options.include_path.append(get_param(option)) elif option == "--include-dir": options.include_path.append(pop_arg()) elif option in ("-w", "--working"): options.working_path = pop_arg() elif option in ("-o", "--output-file"): options.output_file = pop_arg() elif option in ("-t", "--timestamps"): options.timestamps = 1 elif option in ("-f", "--force"): options.timestamps = 0 elif option in ("-v", "--verbose"): options.verbose += 1 elif option in ("-p", "--embed-positions"): Options.embed_pos_in_docstring = 1 elif option in ("-z", "--pre-import"): Options.pre_import = pop_arg() elif option == "--cleanup": Options.generate_cleanup_code = int(pop_arg()) elif option in ("-D", "--no-docstrings"): Options.docstrings = False elif option in ("-a", "--annotate"): Options.annotate = True elif option == "--convert-range": Options.convert_range = True elif option == "--line-directives": options.emit_linenums = True elif option == "--no-c-in-traceback": options.c_line_in_traceback = False elif option == "--gdb": options.gdb_debug = True options.output_dir = os.curdir elif option == "--gdb-outdir": options.gdb_debug = True options.output_dir = pop_arg() elif option == "--lenient": Options.error_on_unknown_names = False Options.error_on_uninitialized = False elif option == '-2': options.language_level = 2 elif option == '-3': options.language_level = 3 elif option == "--capi-reexport-cincludes": options.capi_reexport_cincludes = True elif option == "--fast-fail": Options.fast_fail = True elif option in ('-Werror', '--warning-errors'): Options.warning_errors = True elif option in ('-Wextra', '--warning-extra'): options.compiler_directives.update(Options.extra_warnings) elif option == "--old-style-globals": Options.old_style_globals = True elif option == "--directive" or option.startswith('-X'): if option.startswith('-X') and option[2:].strip(): x_args = option[2:] else: x_args = pop_arg() try: options.compiler_directives = Options.parse_directive_list( x_args, relaxed_bool=True, current_settings=options.compiler_directives) except ValueError as e: sys.stderr.write("Error in compiler directive: %s\n" % e.args[0]) sys.exit(1) elif option.startswith('--debug'): option = option[2:].replace('-', '_') from . import DebugFlags if option in dir(DebugFlags): setattr(DebugFlags, option, True) else: sys.stderr.write("Unknown debug flag: %s\n" % option) bad_usage() elif option in ('-h', '--help'): sys.stdout.write(usage) sys.exit(0) else: sys.stderr.write("Unknown compiler flag: %s\n" % option) sys.exit(1) else: sources.append(pop_arg()) if options.use_listing_file and len(sources) > 1: sys.stderr.write( "cython: Only one source file allowed when using -o\n") sys.exit(1) if len(sources) == 0 and not options.show_version: bad_usage() if Options.embed and len(sources) > 1: sys.stderr.write( "cython: Only one source file allowed when using -embed\n") sys.exit(1) return options, sources
def godopy_cython(): source, outfile_path = sys.argv[1:] pyinit_src_symbol = 'PyInit_' + os.path.basename(outfile_path[:-4]) pyinit_dst_symbol = 'PyInit_' + strip_internal_path(outfile_path).replace( os.sep, '__')[:-4] tempfile = outfile_path.replace('.cpp', '.temp.cpp') tempheaderfile = outfile_path.replace('.cpp', '.temp.h') header_path = outfile_path.replace('.cpp', '.hpp') from Cython.Compiler import Options from Cython.Compiler.Main import compile, default_options, CompilationOptions directives = {'c_string_encoding': 'utf-8'} options = CompilationOptions(default_options, compiler_directives=directives) Options.fast_fail = True options.output_file = tempfile options.cplus = 1 options.language_level = 3 result = compile(source, options) if result.num_errors > 0: raise SystemExit('Cython compilation finished with errors') def clean_line(line): if pyinit_src_symbol in line: line = line.replace(pyinit_src_symbol, pyinit_dst_symbol) # Undefined by #define NO_IMPORT_ARRAY if '_import_array()' in line: line = line.replace('_import_array()', '0') # Fix variable declarations with GDCALLINGCONV, GDCALLINGCONV is valid only for functions if line.lstrip().startswith('GDCALLINGCONV_'): line = re.sub(r'^(\s+)(GDCALLINGCONV_VOID_PTR)(\s\w+;)$', r'\1void *\3', line) line = re.sub(r'^(\s+)(GDCALLINGCONV_VOID)(\s\w+;)$', r'\1void\3', line) line = re.sub(r'^(\s+)(GDCALLINGCONV_BOOL)(\s\w+;)$', r'\1bool\3', line) # Remove "tp_print" deprecation warnings if line.strip( ) == '#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000': line = line.replace( 'PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000', 'PY_VERSION_HEX < 0x030800b1') # FIXME: undeclared identifier, looks like a bug in Cython if line.strip() == '__Pyx_CppExn2PyErr();': line = '' return line with open(outfile_path, 'w', encoding='utf-8') as outfile: with open(tempfile, 'r', encoding='utf-8') as fp: for line in fp: outfile.write(clean_line(line)) os.unlink(tempfile) if os.path.exists(tempheaderfile): with open(header_path, 'w', encoding='utf-8') as outheaderfile: with open(tempheaderfile, 'r', encoding='utf-8') as fp: for line in fp: outheaderfile.write(clean_line(line)) os.unlink(tempheaderfile)
from Cython.Compiler.Main import compile_single, CompilationOptions from Cython.Compiler.TreeFragment import parse_from_strings from Cython.Compiler.Visitor import TreeVisitor from Cython.Compiler import Nodes from Cython.Compiler.AutoDocTransforms import EmbedSignature options = CompilationOptions() options.include_path.append('include') options.language_level = 2 options.compiler_directives = dict( c_string_type='str', c_string_encoding='ascii', ) ctx = options.create_context() tree = parse_from_strings('include.libavutil.avutil', open('scratchpad/test.pxd').read().decode('utf8'), ctx) class Visitor(TreeVisitor): def __init__(self, state=None): super(Visitor, self).__init__() self.state = dict(state or {}) self.events = [] def record_event(self, node, **kw): state = self.state.copy() state.update(**kw) state['pos'] = node.pos state['end_pos'] = node.end_pos() self.events.append(state)