#!/usr/bin/env python import os import sys import subprocess # resolve cython executable cython = None def resolve_cython(): global cython for executable in ('cython', 'cython-2.7'): for path in os.environ['PATH'].split(':'): if not os.path.exists(path): continue if executable in os.listdir(path): cython = os.path.join(path, executable) return def do(fn): print('cythonize:', fn) parts = fn.split('/') assert(parts[-1].endswith('.pyx')) if parts[0] == '.': parts.pop(0) modname = parts[-1][:-4] package = '_'.join(parts[:-1]) # cythonize subprocess.Popen([cython, fn], env=os.environ).communicate() if not package: print('no need to rewrite', fn) else: # get the .c, and change the initXXX fn_c = fn[:-3] + 'c' with open(fn_c) as fd: data = fd.read() modname = modname.split('.')[-1] pat1 = 'init{}(void)'.format(modname) sub1 = 'init{}_{}(void)'.format(package, modname) pat2 = 'PyInit_{}(void)'.format(modname) sub2 = 'PyInit{}_{}(void)'.format(package, modname) pat3 = 'Pyx_NAMESTR("{}")'.format(modname) sub3 = 'Pyx_NAMESTR("{}_{}")'.format(package, modname) pat4 = '"{}"'.format(modname) sub4 = '"{}_{}"'.format(package, modname) print('1: {} -> {}'.format(pat1, sub1)) print('2: {} -> {}'.format(pat2, sub2)) print('3: {} -> {}'.format(pat3, sub3)) print('4: {} -> {}'.format(pat4, sub4)) data = data.replace(pat1, sub1) data = data.replace(pat2, sub2) data = data.replace(pat3, sub3) data = data.replace(pat4, sub4) print('rewrite', fn_c) with open(fn_c, 'w') as fd: fd.write(data) if __name__ == '__main__': print('-- cythonize', sys.argv) resolve_cython() for fn in sys.argv[1:]: do(fn)