带有Cython扩展的Python包出现导入错误
我想用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文件里。
希望这能帮到你……