试图构建一个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
运行?
答
我的问题中的代码正在工作并在安装位置的package/subpackage目录中构建.so文件,但是,当我尝试导入包时找不到文件。但是,当我手动将文件移动到它所在包的根安装目录的位置时。
因此,它似乎要求共享对象文件位于程序包的根目录中,而不是子模块目录。
我能够通过改变扩展定义,像这样来实现这一目标:
extensions = [Extension(
name="foo",
sources=["package/submodule/foo.pyx"],
include_dirs=[numpy.get_include()],
)
]
这使.so文件的根安装目录。
但是我不知道为什么它需要这个共享目标文件位于包的根目录下,而不是像普通python文件那样位于子包目录。
你如何称这个'setup'文件? – hpaulj
with'python setup.py install' – SomeRandomPhysicist
我不是'cython'的专家,但我的脚本需要'python setup.py build_ext --inplace'。这是从turtorials相当标准的脚本。 – hpaulj