带有cython扩展的Python包导致导入错误

时间:2014-08-26 05:30:54

标签: python cython

我想用C扩展创建python包。我想用cython完成这个。我的结构是:

.
├── build
│   ├── lib.linux-i686-2.7
│   │   └── pyA13SOM
│   │       ├── cython
│   │       │   └── spi.so
│   │       └── __init__.py
│   └── temp.linux-i686-2.7
│       └── pyA13SOM
│           └── cython
│               ├── my_test.o
│               └── spi.o
├── CHANGES.txt
├── Makefile
├── MANIFEST
├── pyA13SOM
│   ├── cython
│   │   ├── clibraries
│   │   │   └── spi_test.c
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── spi.c
│   │   ├── spi.pyx
│   │   └── spi.so
│   ├── gpio
│   │   ├── gpio.c
│   │   ├── gpio_lib.c
│   │   ├── gpio_lib.h
│   │   ├── __init__.py
│   │   └── __init__.pyc
│   ├── i2c
│   │   ├── i2c.c
│   │   ├── i2c_lib.c
│   │   ├── i2c_lib.h
│   │   ├── __init__.py
│   │   └── __init__.pyc
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── spi
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── spi.c
│   │   ├── spi_lib.c
│   │   └── spi_lib.h
│   └── utilities
│       └── color.h
├── README.txt
└── setup.py

我的设置文件是:

from distutils.core import setup
from distutils.core import Extension

from Cython.Build import cythonize
from Cython.Distutils import build_ext


module_gpio = Extension('pyA13SOM.gpio',
                        sources=['pyA13SOM/gpio/gpio_lib.c', 'pyA13SOM/gpio/gpio.c'])

module_i2c = Extension('pyA13SOM.i2c',
                       sources=['pyA13SOM/i2c/i2c_lib.c', 'pyA13SOM/i2c/i2c.c'])

module_spi = Extension('pyA13SOM.spi',
                       define_macros=[('CYTHON_IN_USE', '1')],
                       sources=['pyA13SOM/spi/spi_lib.c', 'pyA13SOM/spi/spi.c'])

setup(
    name='pyA13SOM',
    version='0.2.0',
    packages=['pyA13SOM'],
    # ext_modules=[module_gpio, module_i2c, module_spi],
    cmdclass={'build_ext': build_ext},
    ext_modules=cythonize("pyA13SOM/cython/*.pyx"),

)

树在~/mydir/。我转到~/mydir/并执行:python setup.py install

构建过程中的所有内容都可以。接下来我尝试测试import。当我import pyA13SOM.cython.spi时,它应该给我“Hello world”消息。确实如此。

~/mydir/$ **python -c "import pyA13SOM.cython.spi"**
Test:
Hellowwwwwwwwwww!

但是当我从另一个目录中执行此操作时:

~/someotherdir/$ **python -c "import pyA13SOM.cython.spi"**
ImportError: No module named cython.spi

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

您可能需要在$ PYTHONPATH中包含新构建的.spi文件所在的目录。否则python无法找到要导入它的文件。当你在〜/ mydir /时,如果我没有弄错的话,python会搜索本地路径...

根据您使用的shell,您可以使用以下内容将〜/ mydir /目录包含在pythonpath中:

用于bash和sh shell:

PYTHONPATH=$PYTHONPATH:~/mydir/
export $PYTHONPATH

用于csh / tcsh环境:

set PYTHONPATH = ($PYTHONPATH ~/mydir/)

这两个命令将〜/ mydir /临时添加到$ PYTHONPATH。如果要永久添加路径,则必须分别将上述命令添加到〜/ .bashrc或〜/ .tcshrc。

希望这会有所帮助......