这个问题与 SO 中的几个问题相关,例如 this one和 this other one 。不幸的是,到目前为止,该解决方案对我不起作用。我有一个 module.pxc
文件,我正在通过 setup.py
文件对其进行编译,如下所示:
# setup.py
module_extension = Extension(
name="iolif",
sources=["/home/maurizio/Ongoing.Projects/c_libraries/dcomplex_libc.c",
"/home/maurizio/Ongoing.Projects/c_libraries/special_functions_libc.c",
"/home/maurizio/Ongoing.Projects/c_libraries/models/freq_cv_libc.c",
"module.pyx"],
libraries=['gsl', 'gslcblas', 'm'],
# library_dirs=["lib"],
include_dirs=["/home/maurizio/Ongoing.Projects/pycustommodules",
"/home/maurizio/Ongoing.Projects/c_libraries",
"/home/maurizio/Ongoing.Projects/c_libraries/models"]
)
setup(
name="iolif",
ext_modules=cythonize([module_extension])
)
从命令行,在module.pxc
的同一目录中,编写python setup.py build_ext --inplace
编译工作正常,并且iolif .so
库已生成。问题是,如果我使用 Python2.7
,我只能导入这个库,而如果我尝试在 Python3.x
中导入它,我会得到已知的 ImportError : 动态模块未定义模块导出函数(PyInit_iolif)
。
谷歌搜索,正如上面链接的两个问题所指出的,这似乎是由于 cython
正在查看 Python2.7
而不是Python3.x
(这是我使用的)。因此,我尝试在 setup.py
中要求 cythonize
使用 Python3.x
,方法是:
...
setup(
name="iolif",
ext_modules=cythonize([module_extension],
compiler_directives={'language_level': "3"})
)
但是还是不行。最后的编译消息确实产生:
gcc -pthread -shared -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -
specs=/usr/lib/rpm/redhat/redhat-hardened-ld build/temp.linux-x86_64-2.7/pylif_io.o
build/temp.linux-x86_64-2.7/home/maurizio/Ongoing.Projects/c_libraries/dcomplex_libc.o
build/temp.linux-x86_64-2.7/home/maurizio/Ongoing.Projects/c_libraries/special_functions_libc.o build/temp.linux-x86_64-2.7/home/maurizio/Ongoing.Projects/c_libraries/models/freq_cv_libc.o -L/usr/lib64
-lgsl -lgslcblas -lm -lpython2.7 -o /home/maurizio/Ongoing.Projects/DePitta.PNAS/Software/LIF.Analysis/iolif.so
您可以在其中看到它仍然与 -lpython2.7
库链接(而它应该使用例如 -lpython3.7m
)。我该如何解决?我缺少什么?
最佳答案
简单的解决方案。我的 python
命令仍然与 python2.7
关联(我最近转移到 Python3.x
)。对此感到抱歉。因此:
python3 setup.py build_ext --inplace
会成功的。事实上编译现在如下:
gcc -pthread -shared -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -g build/temp.linux-x86_64-3.7/pylif_io.o build/temp.linux-x86_64-3.7/home/maurizio/Ongoing.Projects/c_libraries/dcomplex_libc.o build/temp.linux-x86_64-3.7/home/maurizio/Ongoing.Projects/c_libraries/special_functions_libc.o build/temp.linux-x86_64-3.7/home/maurizio/Ongoing.Projects/c_libraries/models/freq_cv_libc.o -L/usr/lib64 -lgsl -lgslcblas -lm -lpython3.7m -o /home/maurizio/Ongoing.Projects/DePitta.PNAS/Software/LIF.Analysis/iolif.cpython-37m-x86_64-linux-gnu.so
根据需要。
关于python - 无法避免 Cython 在 Python2.7 而不是 Python3.x 中编译外部 C 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60056308/