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

问题描述:

我试图用答案here来添加一个cython扩展到我的包中。目前,它通过代码将.py文件从.pyx文件生成一个.c文件,但不创建共享对象.so文件,因此,当我尝试导入包时,其中一个模块试图导入共享对象文件它找不到它。试图构建一个python包的cython扩展,而不是创建共享对象(.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, 
) 

我怎样才能解决这个问题,这样我可以得到setup.py文件构建共享对象时文件python setup.py install运行?

+0

你如何称这个'setup'文件? – hpaulj

+0

with'python setup.py install' – SomeRandomPhysicist

+0

我不是'cython'的专家,但我的脚本需要'python setup.py build_ext --inplace'。这是从turtorials相当标准的脚本。 – hpaulj

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

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

我能够通过改变扩展定义,像这样来实现这一目标:

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

这使.so文件的根安装目录。

但是我不知道为什么它需要这个共享目标文件位于包的根目录下,而不是像普通python文件那样位于子包目录。