2010-09-29 52 views
2

我嘗試從Cython pxd有條件地編譯(或生成)到c代碼。我讀過,我可以DEF定義一個值和IF來根據它的值有條件地生成,但是我怎麼能得到這個值從pxd文件之外得到?基於外部值的Cython條件編譯

具體而言這兩種情況現在有趣對我來說:

  • 給出一些命令行定義了用Cython,preferrably通過Cython.Distutils setuptools的方式
  • 將extern-ED C頭文件定義了一些值,並有條件地定義使用基於該值用Cython(也許現在不可能?)

謝謝

+0

其實第二點是不可行的,因爲據我所知,Cython實際上並沒有解析出現的頭文件。 – ron 2010-09-30 13:48:24

+0

在http://stackoverflow.com/questions/26225187/try-statement-in-cython-for-cimport-for-use-with-mpi4py/26226758#26226758中給出了一個類似問題的更好的答案。 (當我問這個問題時,我不知道這是否可行) – DavidW 2017-01-04 19:30:14

回答

12

您可以生成一個PXI文件,包括它做你如果說之前 這是我們的例子做Kivy setup.py(相同的./configure生成的config.h了。):

c_options = { 
'use_opengl_es2': True, 
'use_opengl_debug': False, 
'use_glew': False, 
'use_mesagl': False} 

print 'Generate config.pxi' 
with open(join(dirname(__file__), 'kivy', 'graphics', 'config.pxi'), 'w') as fd: 
    for k, v in c_options.iteritems(): 
     fd.write('DEF %s = %d\n' % (k.upper(), int(v))) 

,然後在你的pxd:

include "config.pxi" 
IF USE_OPENGL_DEBUG == 1: 
    # do other import or whatever you want 
+0

您也可以通過重複來執行「config.h」的同一代操作,並將DEF's =%d''更改爲'' #define%s%d'' – tito 2011-03-02 00:19:49

+0

我發現編輯該文件不會觸發緩存清除該文件。即如果你改變了config.pxi,舊的仍然會被修改。有什麼辦法呢? – 2017-01-27 12:50:43

+0

啊有辦法,需要在你的setup.py中包含config.pxi到source_files – 2017-01-27 12:54:43

2

實際上,第二個選項比較容易。在一些.h文件中創建一個標記,然後做

cdef extern from "header.h": 
    cdef int FLAG 

那麼當你要使用它,只寫

if FLAG: 
    ... 

而且即使用Cython會生成代碼,C編譯器會自動修剪因爲它知道編譯時FLAG的價值。

+0

這對於簡單的事情可行,但它不會讓你做有條件的extern,而接受的答案卻可以。 – totaam 2014-04-09 10:40:14

+0

,它不會讓你'ctypedef'決定,例如,在單精度浮點數和雙精度浮點數之間。所以接受的答案肯定更加強大 – 2017-03-15 13:45:42