尝试为 python 包构建一个 cython 扩展,而不是创建共享对象 (.so) 文件
Attempting to build a cython extension to a python package, not creating shared object (.so) file
我试图使用答案 将 cython 扩展的构建添加到我的包中。它目前 cythonizes 代码以从 .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 文件来构建共享对象文件?
我问题中的代码正在运行并在安装位置的 package/subpackage 目录中构建 .so 文件,但是,当我尝试导入包时找不到该文件。但是,当我手动将文件移动到它工作的包的根安装目录的位置时。
因此似乎要求共享对象文件位于包的根目录而不是子模块目录中。
我可以通过像这样更改扩展定义来实现此目的:
extensions = [Extension(
name="foo",
sources=["package/submodule/foo.pyx"],
include_dirs=[numpy.get_include()],
)
]
这会将 .so 文件放在根安装目录中。
但是我不确定为什么它要求这个共享对象文件位于包的根目录中,而不是像普通 python 文件那样位于子包目录中。
我试图使用答案
我的 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 文件来构建共享对象文件?
我问题中的代码正在运行并在安装位置的 package/subpackage 目录中构建 .so 文件,但是,当我尝试导入包时找不到该文件。但是,当我手动将文件移动到它工作的包的根安装目录的位置时。
因此似乎要求共享对象文件位于包的根目录而不是子模块目录中。
我可以通过像这样更改扩展定义来实现此目的:
extensions = [Extension(
name="foo",
sources=["package/submodule/foo.pyx"],
include_dirs=[numpy.get_include()],
)
]
这会将 .so 文件放在根安装目录中。
但是我不确定为什么它要求这个共享对象文件位于包的根目录中,而不是像普通 python 文件那样位于子包目录中。