2016-07-21 63 views
1

因此,我一直试图获得一个简单的脚本运行,其中我使用Cython 0.24在MacOS 10.11中将C代码合并到我的python项目中.5(埃尔卡皮坦)。我使用Python版本2.7.10编辑PyCharm的代码。我的setup.py看起来像这样致命错误:未找到'mymodule.h'文件 - Cython编译无法找到标题

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 
from Cython.Build import cythonize 
import os 

dirs = [os.getcwd()] 

ext = [Extension("hello_world", 
        include_dirs=dirs, 
        sources=["mymodule.c","hello_world.pyx"], 
        depends=["mymodule.h"])] 
setup(
    name = "testing", 
    cmdclass={'build_ext' : build_ext}, 
    ext_modules = cythonize(ext) 
) 

它生成hello_world.c就好了,也产生一个build目录和.so文件 的* .pyx文件的*包含以下定义,这显然是定义相匹配在mymodule.h

cdef extern from "mymodule.h": 
    cdef float MyFunction(float, float) 

我尝试了这里的解决方案建议:"'cc' failed with exit status 1" error when install python library

export CFLAGS=-Qunused-arguments 
export CPPFLAGS=-Qunused-arguments 

和自定义扩展小号olution已经在上面的代码来自这里: Compiling Cython with C header files error

我也尝试了MacOS的具体解决方案建议在这里,但那只是绝望:https://github.com/wesm/feather/issues/61

export MACOSX_DEPLOYMENT_TARGET=10.11 

不过遗憾的是它仍然是行不通的。我相信Cython是正常工作的,因为我事先实现了一些函数,并且可以在Cython实现时调用它们。这只是包括实际的C代码,这个问题发生在我身上。

我希望有人能帮助我,在此先感谢!

编辑: 我收到以下错误消息

/Users/Me/.pyxbld/temp.macosx-10.11-intel-2.7/pyrex/hello_world.c:263:10: fatal error: 'mymodule.h' file not found 
#include "mymodule.h" 
     ^
1 error generated. 
Traceback (most recent call last): 
    File "/Users/Me/Dropbox/Uni/MasterThesis/PythonProjects/cython_hello_world/main.py", line 3, in <module> 
    import hello_world 
    File "/Users/Me/Library/Python/2.7/lib/python/site-packages/pyximport/pyximport.py", line 445, in load_module 
    language_level=self.language_level) 
    File "/Users/Me/Library/Python/2.7/lib/python/site-packages/pyximport/pyximport.py", line 234, in load_module 
    exec("raise exc, None, tb", {'exc': exc, 'tb': tb}) 
    File "/Users/Me/Library/Python/2.7/lib/python/site-packages/pyximport/pyximport.py", line 216, in load_module 
    inplace=build_inplace, language_level=language_level) 
    File "/Users/Me/Library/Python/2.7/lib/python/site-packages/pyximport/pyximport.py", line 192, in build_module 
    reload_support=pyxargs.reload_support) 
    File "/Users/Me/Library/Python/2.7/lib/python/site-packages/pyximport/pyxbuild.py", line 102, in pyx_to_dll 
    dist.run_commands() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py", line 953, in run_commands 
    self.run_command(cmd) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py", line 972, in run_command 
    cmd_obj.run() 
    File "/Users/Me/Library/Python/2.7/lib/python/site-packages/Cython/Distutils/build_ext.py", line 164, in run 
    _build_ext.build_ext.run(self) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/build_ext.py", line 337, in run 
    self.build_extensions() 
    File "/Users/Me/Library/Python/2.7/lib/python/site-packages/Cython/Distutils/build_ext.py", line 172, in build_extensions 
    self.build_extension(ext) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/build_ext.py", line 496, in build_extension 
    depends=ext.depends) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/ccompiler.py", line 574, in compile 
    self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts) 
    File  "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/unixccompiler.py", line 122, in _compile 
    raise CompileError, msg 
ImportError: Building module hello_world failed: ["CompileError: command 'cc' failed with exit status 1\n"] 
+0

你是否在某处丢失了文件'mymodule.h'?它不是由cython/setup.py生成 –

+0

有mymodule.c和mymodule.h,是的。他们都在工作目录中,所以我认为这足以使用os.getcwd()作为include_dir – meetaig

+0

我会尝试'ext_modules = ext'而不是'ext_modules = cythonize(ext)'。至少我没有看到'cythonize()'这样的叫法。 –

回答

0

我解决它在我自己的。问题其实不在我在这里发布的代码中,而是在调用该函数的代码中。 我行

import pyximport 
pyximport.install() 

仍然在代码调用程序hello_world函数之前。这似乎导致了这个问题。当我删除这两行时,该函数可以被称为很好。

相关问题