【问题标题】:Importing Modules from Cython into Python Program将 Cython 中的模块导入 Python 程序
【发布时间】:2023-11-27 09:42:01
【问题描述】:

我花了最后一个小时寻找可能的解决方案,但之前的答案似乎都没有帮助。我有两个文件,comp.pyx(编译后变成 comp.c)和 comp_exec.py。

现在 comp.pyx 看起来像这样:

cdef extern from "math.h":
double sin(double x)
double cos(double x)
double sqrt(double x)
double atan(double x)
double exp(double x)
double log(double x)
double fabs(double x)

import array
import random
cimport numpy as np
import numpy as np
cimport cython

# Some other code

cdef void fm(double a, double b, double c, double d, int e, int f, int g, int h, double i, double j, double k, str l):
    #some code

def fm1 (a, b, c, d, e, f, g, h, i, j, k, l):
    fm(a,b,c,d,e,f,g,h,i,j,k,l)

同时,comp_exec.py 看起来像这样(变量定义不是这里的问题):

import multiprocessing
import scipy
import math
import sys
import numpy as np
import comp

def doThis(x, g, h, l, tm, tn, ij, ji, sig):
    cpu = multiprocessing.cpu_count()
    pool = multiprocessing.Pool(processes=cpu)
    print "Running on", cpu, "cores."
    results = []
    for n in range(0,Nmax):
        for t in range(0,tmax):
            th = math.acos(1-t*dt)
            for p in range(0,Np):
                phi = p*dp
                filename = get_filename(n,t,p)
                temp = (x,l+k*n,a[1],a[2],a[3],a[4],a[5],a[6],th,ph,s,f)
                pool.apply_async(comp.fm1,args=temp,callback=logResult)
    pool.close()
    pool.join()

#Some code to fill array args[] with parameters from file

doThis(args[0], args[1], (etc) ..., args[8])

运行 comp_exec.py 时,它告诉我“模块”对象没有属性“fm1”。我不相信有任何循环继承,并且我已经将 fm 函数包装在 fm1 函数中,该函数应该对 comp_exec.py 可见。这里可能是什么问题?

编辑:这是 setup.py 的样子。我运行命令

python setup.py build_ext --inplace

在命令提示符下编译 Cython 文件。

setup.py:

from distutils.core import setup, Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("comp.pyx")
)

【问题讨论】:

  • 你能显示你的 setup.py 吗?如何编译扩展模块?
  • @cel 我进行了编辑以包含 setup.py

标签: python python-import importerror


【解决方案1】:

我无法解释我的答案,但程序在更改两件事后开始工作:1)从函数名称中删除数字(即将名称“fm1”更改为“function”)和 2)添加返回值,例如

return 1

如果有人能解释一下,那将很有帮助。

【讨论】: