【问题标题】:Cannot avoid Cython from compiling external C module in Python2.7 rather than Python3.x无法避免 Cython 在 Python2.7 而不是 Python3.x 中编译外部 C 模块
【发布时间】:2020-02-04 11:23:05
【问题描述】:

这个问题与 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: 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


【解决方案1】:

简单的解决方案。我的python 命令仍然与python2.7 相关联(我最近移至Python3.x)。对不起。因此:

python3 setup.py build_ext --inplace

会成功的。 Indeed 编译现在显示为:

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

根据需要。

【讨论】:

  • @samcarter_is_at_topanswers.xyz 谢谢。我是这么想的。但它并没有解决问题。很长一段时间以来,Linux 都没有提供 AR。而其他像 pdfpc 这样的演示选项在 GNOME 下将不起作用。此外,Fedora 30+ 使用 Wayland,这让事情变得更加复杂......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2018-09-27
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多