【发布时间】:2019-06-28 18:59:52
【问题描述】:
对于背景,我已阅读以下问题: https://github.com/cython/cython/wiki/PackageHierarchy
Cython cimport cannot find .pxd module
How do you get cimport to work in Cython?
Error compiling Cython file: pxd not found in package
问题是这样的。我曾经有大量的 C、C++ 和 Cython 都放在一个目录中并且编译得很好。现在,我将代码分成 2 个目录:
- 模块“cpysim”的 C/C++/Cython 源代码
- 另一个模块“dut”的 C/C++/Cython 代码
基本原理是模块cpysim 将被多次重用,而模块dut 将因项目而异。最后一个问题是模块cpysim 中的一个文件只能参考模块dut 中的一个文件进行编译,这就是给我带来问题的原因。
需要明确的是,当所有内容都在一个目录中时,一切都可以正常编译。这就是现在的样子。
<root>
-- __init__.py
-- cpysim
-- __init__.py
-- __init__.pxd
-- sim_core.cpp
-- sim_core.hpp
-- sim_core.pxd
....
wiretypes.pyx
<other sources>
-- dut
-- wire_names.def
-- setup_dut.py
<other sources>
目标
从dut 目录编译wiretypes.pyx(从位于dut 目录中的setup_dut.py)。
试试 1
此导入在wiretypes.pyx 中给我带来了麻烦
from libcpp cimport bool
from sim_core cimport sigtype_t # <-- this one
....
这是setup_dut.py的相关内容
inc_dirs = ['./', '../', '../cpysim/', '../build', '../dSFMT-src-2.2.3', '../build/include']
....
Extension("wiretypes",
["../cpysim/wiretypes.pyx"],
language="c++",
libraries=["cpysim", "ethphy"],
include_dirs=inc_dirs,
library_dirs=lib_dirs,
extra_compile_args=compile_args,
extra_link_args=link_args),
....
ext = cythonize(extensions,
gdb_debug=True,
compiler_directives={'language_level': '3'})
setup(ext_modules=ext,
cmdclass={'build_ext': build_ext},
include_dirs=[np.get_include()])
为什么我认为这应该起作用:根据文档,指定包含 sim_core.pxd 标头的包含路径就足够了。例如,cimport numpy as np 在设置 include_dirs=[np.get_include()] 时有效,np.get_include() 只是吐出一条路径。所以,在inc_dirs 中,我输入了../cpysim。当我编译时,我得到了
Error compiling Cython file:
------------------------------------------------------------
...
"""
Cython header defining a net.
"""
from libcpp cimport bool
from sim_core cimport sigtype_t
^
------------------------------------------------------------
/Users/colinww/system-model/cpysim/wiretypes.pyx:8:0: 'sim_core.pxd' not found
试试 2
我想也许我需要将cpysim 目录视为一个模块。所以我添加了__init__.py,并将wiretypes.pyx中的导入改为:
from libcpp cimport bool
cimport cpysim.sim_core as sim_core
Error compiling Cython file:
------------------------------------------------------------
...
"""
Cython header defining a net.
"""
from libcpp cimport bool
cimport cpysim.sim_core as sim_core
^
------------------------------------------------------------
/Users/colinww/system-model/cpysim/wiretypes.pyx:8:8: 'cpysim/sim_core.pxd' not found
所以现在我很茫然。我不明白为什么我的第一次尝试没有成功,我知道包含目录正在正确传递,因为还有许多其他需要找到并正确编译的标头。
我认为cimport 工作原理的一些基本方面是我缺少的。
【问题讨论】:
-
更奇怪的行为:指定
include_dirs=['../cpysim']与cpysim_dir = os.path.abspath(os.path.join(os.getcwd(), '../cpysim'))sys.path.insert(0, cpysim_dir)具有不同的行为...为什么将目录放在系统路径与包含路径上会有所不同?