#!/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)

#!/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)
    assert(fn.endswith('.pyx'))
    parts = fn.split('/')
    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]
        pac_mod = '{}_{}'.format(package, modname)
        fmts = ('init{}(void)', 'PyInit_{}(void)', 'Pyx_NAMESTR("{}")', '"{}"')
        for i, fmt in enumerate(fmts):
            pat = fmt.format(modname)
            sub = fmt.format(pac_mod)
            print('{}: {} -> {}'.format(i + 1, pat, sub))
            data.replace(pat, sub)
        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)

Streamline replacement logic