2017-08-28 39 views
0

說我有一個Python函數,它生成並返回一個擴展模塊的C代碼作爲字符串。現在,我希望在運行時將此C代碼編譯爲一個擴展模塊,以便我可以導入它。在運行時編譯Python擴展模塊

我該怎麼做?

似乎應該可以使用setuptoolsdistutils達到此目的,因爲setup.py本身就是一個普通的Python腳本。但是,這些軟件包會執行大量與安裝,依賴性檢查等相關的額外工作。是否有任何直接的API鉤子可以讓我簡單地編譯一個擴展模塊?

回答

0

我找到相關的代碼在PyStan項目, 具體而言,pystan.model模塊,其本質不正是我需要英寸我會在這裏爲後代編寫代碼片段。下面甚至可以處理Cython擴展,但如果你不需要,它可以很容易地適用於刪除Cython的依賴。

from distutils.core import Extension 

import Cython 
from Cython.Build.Inline import _get_build_extension 
from Cython.Build.Dependencies import cythonize 

# you can add include_dirs= and extra_compile_args= here 
extension = Extension(name='mymodule', language='c++', sources=[srcfile]) 

build_extension = _get_build_extension() 
build_extension.extensions = cythonize([extension], 
             include_path=[], 
             quiet=False) 
build_extension.build_temp = os.path.dirname(srcfile) 
build_extension.build_lib = build_dir # where you want the output 

build_extension.run() 

編譯之後,你可以把它變成路徑(或增加其路徑sys.path)並調用importlib.import_module()加載模塊。