带有Cython扩展的Python包出现导入错误

0 投票
1 回答
507 浏览
提问于 2025-04-18 18:31

我想用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 个回答

1

你可能需要把你新建的.spi文件所在的文件夹加到你的$PYTHONPATH里。否则,Python就找不到这个文件,无法导入它。当你在~/mydir/这个文件夹里时,Python会搜索本地路径,如果我没记错的话……

根据你使用的命令行工具,你可以用以下方式把~/mydir/这个文件夹加到pythonpath里:

对于bash和sh命令行:

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

对于csh/tcsh环境:

set PYTHONPATH = ($PYTHONPATH ~/mydir/)

这两个命令会暂时把~/mydir/加到你的$PYTHONPATH里。如果你想永久添加这个路径,你需要把上面的命令加到你的~/.bashrc或~/.tcshrc文件里。

希望这能帮到你……

撰写回答