5

有一个带有 setup.py 的 Python 包,其内容如下:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
  name = 'fastahack',
  ext_modules=[
    Extension("fastahack.cfastahack",
              sources=["fastahack/cfastahack.pyx", "lib/Fasta.cpp", "lib/split.cpp"],
              libraries=["stdc++"],
              include_dirs=["lib/"],
              language="c++"),
    ],
    package_data = {'lib': ['*.pyx', "*.c", "*.h", "README.rst"]},
    package_dir = {"fastahack": "fastahack"},
    cmdclass = {'build_ext': build_ext},
    packages = ['fastahack', 'fastahack.tests'],
    author = "Brent Pedersen",
    author_email="bpederse@gmail.com",
    #test_suite='nose.collector'
)

如果未安装 Cython,则无法导入此 setup.py。据我所知,导入 setup.py 是 pip 等工具找出包的依赖关系的方式。我想设置这个包,以便它可以上传到 PyPI,并指出它依赖于 Cython,这样当您尝试“pip install fastahack”或尝试“ pip install”直接从 Git 存储库。

当没有安装 Cython 时,我将如何打包这个模块以便它从 Internet 正确安装?始终使用最新版本的 Cython 将是一个加分项。

4

3 回答 3

4

我的 setup.py 标准模板:

have_cython = 假
尝试:
    从 Cython.Distutils 导入 build_ext 作为 _build_ext
    have_cython = 真
导入错误除外:
    从 distutils.command.build_ext 导入 build_ext 作为 _build_ext

如果有_cython:
    foo = Extension('foo', ['src/foo.pyx'])
别的:
    foo = Extension('foo', ['src/foo.c'])

设置 (
   ...
   ext_modules=[foo],
   cmdclass={'build_ext': build_ext}

并且不要忘记提供带有包的扩展 .c 文件 - 这将允许用户在不安装 cython 的情况下构建模块。

于 2013-08-03T16:21:47.260 回答
3

您可以使用PEP-518项目规范将 Cython 指定为构建依赖项。

在文件pyproject.toml中(与 相同的目录中setup.py)插入:

[build-system]
requires = ["setuptools", "wheel", "Cython"]

然后将在构建您的包之前安装 Cython。

请注意,(当前)如果您在本地将软件包安装为可编辑(即使用or )--no-use-pep517,则需要传递pip install--editable-e

于 2019-07-01T15:25:08.393 回答
1

使用tryandexcept进行Cython导入并setup根据导入是否成功进行修改。以Pandas的setup.py为例

于 2013-08-02T22:06:31.167 回答