【问题标题】:Cython on Termux. ImportError: dynamic module does not define module export function (PyInit_libmc)Termux 上的 Cython。 ImportError:动态模块未定义模块导出函数(PyInit_libmc)
【发布时间】:2019-06-01 09:31:18
【问题描述】:

我正在尝试在 Termux 中的 Android 上使用 python/cython。我安装了 python,cython pip - 没有“明显”的问题。现在我有两个简单的 test-sn-ps

一个“主”文件 mct.py

import os
hm=os.path.expanduser('~')
os.chdir(hm+'/projects/python1/v1')
from libmc import sq

print(sq(4))

还有一个愚蠢而琐碎的 cython '库'

cpdef double sq(double x):
  return x*x

我以简单的方式编译了库(没有 distutils fuzz),即我这样做了

cython -3 mct.pyx

clang -shared -pthread -fpic -fwrapv -fno-strict-aliasing -O2 -Wall -I /data/data/com.termux/files/usr/include/python3.7m/ -o libmc.so -lpython3 mc.c

我确实在我的项目根目录中获得了一个 libmc.so。但是,当我尝试时

python mct.py

我明白了

Traceback (most recent call last):
  File "mct.py", line 4, in <module>
    from libmc import sq
ImportError: dynamic module does not define module export function (PyInit_libmc)

现在我被困住了。我在这里想念什么?有什么建议可以解决这个问题吗?

标记

PS.: 澄清一下,“正常”的 Python 在那个 Android 机器上似乎对我很有效。

【问题讨论】:

    标签: android python cython termux


    【解决方案1】:

    pyx 的名称需要为libmc。 Cython 将根据文件名生成一个 init 函数,该文件名当前与 .so 文件被调用的文件名不匹配(当 Python 导入已编译的模块时,它会根据 .so 文件名查找一个 init 函数)。

    【讨论】:

    • 哎呀,对于这么长又混乱的 Q 来说,这样一个直截了当的正确 A ;)。将 -o libmc.so 更改为 -o mc.so 以进行 clang 调用,并将 import libmc 更改为在 python sn-p 中导入 mc。现在它的工作!
    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2023-03-10
    • 2016-03-21
    • 1970-01-01
    • 2021-12-17
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多