【问题标题】:Attempting to build a cython extension to a python package, not creating shared object (.so) file尝试为 python 包构建 cython 扩展,而不是创建共享对象 (.so) 文件
【发布时间】:2017-12-06 02:25:27
【问题描述】:

我尝试使用答案 here 将 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 文件来构建共享对象文件?

【问题讨论】:

  • 你怎么称呼这个setup文件?
  • python setup.py install
  • 我不是cython 的专家,但我的脚本需要python setup.py build_ext --inplace。这是教程中相当标准的脚本。
  • 是的,当我将它用作单个 cython 文件时,我正在这样做,以便它可以构建到共享对象文件中,然后导入到 python 中,但我现在希望它构建和与我的 python 包的其余部分一起安装 python setup.py build_ext --inplace 确实会创建 .so 文件。但是,当我运行python setup.py install 时,子模块仍然找不到共享对象文件,这表明它没有复制到安装位置并且不知道 cython 对象。
  • 每个包对应的目录下是否有__init__.py文件?

标签: python package cython setuptools cythonize


【解决方案1】:

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

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

我可以通过像这样更改扩展定义来实现这一点:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多