我嘗試從Cython pxd有條件地編譯(或生成)到c代碼。我讀過,我可以DEF定義一個值和IF來根據它的值有條件地生成,但是我怎麼能得到這個值從pxd文件之外得到?基於外部值的Cython條件編譯
具體而言這兩種情況現在有趣對我來說:
- 給出一些命令行定義了用Cython,preferrably通過Cython.Distutils setuptools的方式
- 將extern-ED C頭文件定義了一些值,並有條件地定義使用基於該值用Cython(也許現在不可能?)
謝謝
我嘗試從Cython pxd有條件地編譯(或生成)到c代碼。我讀過,我可以DEF定義一個值和IF來根據它的值有條件地生成,但是我怎麼能得到這個值從pxd文件之外得到?基於外部值的Cython條件編譯
具體而言這兩種情況現在有趣對我來說:
謝謝
您可以生成一個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
您也可以通過重複來執行「config.h」的同一代操作,並將DEF's =%d''更改爲'' #define%s%d'' – tito 2011-03-02 00:19:49
我發現編輯該文件不會觸發緩存清除該文件。即如果你改變了config.pxi,舊的仍然會被修改。有什麼辦法呢? – 2017-01-27 12:50:43
啊有辦法,需要在你的setup.py中包含config.pxi到source_files – 2017-01-27 12:54:43
實際上,第二個選項比較容易。在一些.h文件中創建一個標記,然後做
cdef extern from "header.h":
cdef int FLAG
那麼當你要使用它,只寫
if FLAG:
...
而且即使用Cython會生成代碼,C編譯器會自動修剪因爲它知道編譯時FLAG的價值。
這對於簡單的事情可行,但它不會讓你做有條件的extern,而接受的答案卻可以。 – totaam 2014-04-09 10:40:14
,它不會讓你'ctypedef'決定,例如,在單精度浮點數和雙精度浮點數之間。所以接受的答案肯定更加強大 – 2017-03-15 13:45:42
其實第二點是不可行的,因爲據我所知,Cython實際上並沒有解析出現的頭文件。 – ron 2010-09-30 13:48:24
在http://stackoverflow.com/questions/26225187/try-statement-in-cython-for-cimport-for-use-with-mpi4py/26226758#26226758中給出了一個類似問題的更好的答案。 (當我問這個問題時,我不知道這是否可行) – DavidW 2017-01-04 19:30:14