【发布时间】:2020-02-04 11:23:05
【问题描述】:
这个问题与 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: dynamic module does not define module export function (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)。我该如何解决?我错过了什么?
【问题讨论】:
-
您应该使用 Python3 而不是 Python2 调用 setup.py。这就是 distutils 的工作原理。
标签: python c python-3.x shared-libraries cython