包内引用+ cython

时间:2016-01-03 16:06:39

标签: python import cython

大家下午好。 祝你2016年新的一切顺利。

我正在对我的代码进行cython化,而且我是新手。

我的结构是:

.
MotorControlModel
    ├─ runTest.py
    ├─ ArmModel
        ├─ Arm.pyx
        ├─ Arm.pxd
        ├─ ArmParameters.pxd
        ├─ ArmParameters.pyx
        ├─ MusclesParameters.pxd
        ├─ MusclesParameters.pyd

Arm.pxd:

import numpy as np
cimport numpy as np

import MusclesParameters 
from MusclesParameters cimport MusclesParameters

import ArmParameters
from ArmParameters cimport ArmParameters

cdef class Arm:
...

ArmParameters.pxd:

import numpy as np
cimport numpy as np

cdef class ArmParameters :
...

MusclesParameters.pxd:

import numpy as np
cimport numpy as np

cdef class MusclesParameters:
...

runTest.py:

import numpy as np
import os    
import ArmModel

print("--------------Muscles---------------")

from ArmModel import MusclesParameters as MusclesParam    
Muscles = MusclesParam.MusclesParameters()

print("--------------ArmParam---------------")

from ArmModel import ArmParameters as ArmParam
ArmParam = ArmParam.ArmParameters()

print("--------------Arm---------------")
from ArmModel import Arm as Arm
arm1 = Arm.Arm()

我的问题如下: 如果我跑:

python runTest.py 

我收到错误消息:

--------------Muscles---------------
init MusclesParameters
--------------ArmParam---------------
init ArmParameters
--------------Arm---------------
Traceback (most recent call last):
  File "runTest.py", line 19, in <module>
    from ArmModel import Arm as Arm
  File "MotorControlModel/ArmModel/MusclesParameters.pxd", line 4, in init MotorControlModel.ArmModel.Arm (Arm.c:8082)
ImportError: No module named MotorControlModel.ArmModel.MusclesParameters

正如我在错误日志中看到的那样,Arm.pxd无法链接到MusclesParameters&amp; ArmParameters。我认为这些模块的路径不是正确的。 我尝试使用 cimport 并在网上搜索,但我没有找到解决方法。

你能帮我解决这个问题:-D

非常感谢^ - ^

由于

---编辑7/1/12 -------------

我发现所有文件都编译得很好,但是它们是在正确的文件夹中编译的:-S。

如果我抓住那些* .so文件并将它们添加到我的包文件夹中,一切都在运行(包括内部包依赖)。

下一步是理解为什么编译器没有把文件放在我想要的地方:-D

1 个答案:

答案 0 :(得分:0)

您必须仔细阅读Python docs for package imports。 Cython遵循相同的规则。它似乎

  • 您需要一个新的ArmModel/__init__.py。它可以是空的,但它需要在那里。
  • .pxd文件中的导入必须是绝对或相对导入到包。以下是两种方法的演示:

Arm.pxd(相对进口)

import numpy as np
cimport numpy as np

from . import MusclesParameters 
from .MusclesParameters cimport MusclesParameters

from . import ArmParameters
from .ArmParameters cimport ArmParameters

cdef class Arm:
... 

Arm.pxd(绝对进口)

import numpy as np
cimport numpy as np

from ArmModel import MusclesParameters 
from ArmModel.MusclesParameters cimport MusclesParameters

from ArmModel import ArmParameters
from ArmModel.ArmParameters cimport ArmParameters

cdef class Arm:
... 
  • 目前还不清楚你是如何编译Cython模块的,但在我的实验中,如果你正在使用cythonize -b <module.pyx>,你必须从包外运行它,其他编译因模块中缺少缺少cimport而失败。&#39; 错误。
  • 如果您正在使用setup.py进行编译,那么只要您遵循教程指南,这一切都会正常工作。