试图为python包构建cython扩展,而不是创建共享对象(.so)文件

时间:2017-07-02 20:43:15

标签: python package cython setuptools cythonize

我试图使用答案here将cython扩展的构建添加到我的包中。它目前对代码进行cython化以从.pyx文件生成.c文件但是没有创建共享对象.so文件,因此当我尝试导入包时,其中一个模块尝试导入共享目标文件找不到它。

我的setup.py文件(略有缩减)如下:

from setuptools import setup
from setuptools.extension import Extension
import os
import numpy
from Cython.Build import cythonize

mypackage_root_dir = os.path.dirname(__file__)
with open(os.path.join(mypackage_root_dir, 'requirements.txt')) as requirements_file:
    requirements = requirements_file.read().splitlines()

extensions = [Extension(
    name="package.submodule.foo",
    sources=["package/submodule/foo.pyx"],
    include_dirs=[numpy.get_include()],
    )
]

setup(name='package',
      version=0.1,
      description='...',
      author='my name',
      author_email='my email',
      url="...",

      include_package_data=True,
      packages=['package',
                'package.submodule1',
                'package.submodule2',
                'package.submodule', # the one that uses the pyx file
      ],
      ext_modules = cythonize(extensions),
      install_requires=requirements,
)

如何解决此问题,以便在运行python setup.py install时可以获取setup.py文件来构建共享对象文件?

1 个答案:

答案 0 :(得分:1)

我的问题中的代码正在工作并在安装位置的package / subpackage目录中构建.so文件,但是,当我尝试导入包时,它无法找到该文件。但是,当我手动将文件移动到它工作的程序包的根安装目录的位置时。

因此,似乎要求共享对象文件位于包的根目录而不是子模块目录中。

我可以通过改变扩展名定义来实现这一点:

extensions = [Extension(
        name="foo",
        sources=["package/submodule/foo.pyx"],
        include_dirs=[numpy.get_include()],
        )
    ]

这会将.so文件放在根安装目录中。

但是我不确定为什么它需要这个共享对象文件在包的根目录而不是像普通python文件那样在子包目录中。