python - 无法避免 Cython 在 Python2.7 而不是 Python3.x 中编译外部 C 模块

标签 python c python-3.x shared-libraries cython

这个问题与 SO 中的几个问题相关,例如 this onethis 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/

相关文章:

Python argparse 有一个关于单字符选项参数的错误 (?)

c - 如何从动态库中检测主要可执行文件的函数定义 - 特别是 malloc

c++ - 为什么 perror 在错误处理代码中没有广泛出现是有原因的?

python - 为什么 dataclasses.astuple 返回类属性的深度拷贝?

python - 使用 boto3 根据 AssumeRolePolicyDocument 中的操作列出角色名称

python - 如何从字符串列表中删除单词列表?

python - 解析目录和所有子目录中的所有 XML 文件

python - 使用 Keras 处理文本进行分类

c - 在C中对2D数组(矩阵)进行排序

python自变量从类到装饰器