如何将 setup.py 替换为 pyproject.toml 以获取本机 C 构建依赖项?

not*_*bit 4 python compilation setup.py pyproject.toml

我遇到了这个小项目,用于创建要在 python 中使用的Black-Scholes函数的 C 编译版本。

\n

尽管示例代码似乎已于今年 7 月发布,但setup.py构建的使用类型似乎已在旧版构建之外被弃用。任何编译失败,首先抱怨缺少MS C++ 14编译器(这不是真的),然后进一步调查,似乎表明 setup.py 不能再使用。

\n

问:如何将其转换setup.py为有效pyproject.toml文件?

\n
from setuptools import setup, Extension\n\next = Extension(\'bs\', sources=[\'black_scholes/bs.c\'])\n\nsetup(\n    name="black_scholes",\n    version="0.0.1",\n    description="European Options Pricing Library",\n    packages=[\'black_scholes\'],\n    ext_modules=[ext]\n)\n
Run Code Online (Sandbox Code Playgroud)\n

从有点模糊的网站(上面),我创建了以下树结构。

\n
$ tree -L 3 ./\n./\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 black_scholes\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 black_scholes\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Makefile\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bs.c\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bs_test.py\n
Run Code Online (Sandbox Code Playgroud)\n

可能相关的问题:

\n\n

not*_*bit 7

在浪费了 2 天时间试图规避所需的Visual StudioC++ Build tools要求之后,唯一不幸的可行选择是提交下载,>7GB以便让我的 20 行 C 函数在Py3.10. (按照这个。)

\n

使用外部_custom_build.py

\n

以下是有效的文件:

\n
# setup.py\nfrom setuptools import setup, Extension\n\next = Extension(\'bs\', sources=[\'black_scholes/bs.c\'])\n\nsetup(\n    name="black_scholes",\n    version="0.0.1",\n    description="European Options Pricing Library",\n    packages=[\'black_scholes\'],\n    ext_modules=[ext]\n)\n
Run Code Online (Sandbox Code Playgroud)\n

然后对于pyproject.toml

\n
# pyproject.toml\n[build-system]\nrequires = ["setuptools>=61.0", "cython"]\nbuild-backend = "setuptools.build_meta"\n\n[project]\nname        = "black_scholes"\ndescription = "European Options Pricing Library"\nversion     = "0.0.1"\nreadme      = "README.md"\nrequires-python = ">=3.7"\nauthors = [\n  { name="Example Author", email="author@example.com" },\n]\nclassifiers = [\n    "Programming Language :: Python :: 3",\n    "License :: OSI Approved :: MIT License",\n    "Operating System :: OS Independent",\n]\nkeywords = ["quant", "portfolio"]\n\n[project.urls]\n"Homepage" = "https://pyquantnews.com/how-to-45x-python-performance-with-c/"\n\n[tool.setuptools]\npy-modules = ["_custom_build"]\n\n[tool.setuptools.cmdclass]\nbuild_py = "_custom_build.build_py"\n
Run Code Online (Sandbox Code Playgroud)\n

这是使用一个名为 的外部构建文件_custom_build.py,如上面的 SO 链接所建议的。

\n
# _custom_build.py\n\nfrom setuptools import Extension\nfrom setuptools.command.build_py import build_py as _build_py\n\nclass build_py(_build_py):\n    def run(self):\n        self.run_command("build_ext")\n        return super().run()\n\n    def initialize_options(self):\n        super().initialize_options()\n        if self.distribution.ext_modules == None:\n            self.distribution.ext_modules = []\n\n        self.distribution.ext_modules.append(\n\n            Extension(\n                "bs",\n                sources=["black_scholes/bs.c"],\n                extra_compile_args=["-std=c17", "-lm", "-Wl", "-c", "-fPIC"],\n            )\n        )\n
Run Code Online (Sandbox Code Playgroud)\n

然而,似乎extra_compile_args完全被忽略了......

\n
\n

如果有人能够提出使用较小的编译器进行构建的替代解决方案,就像MinGW这样,那就太好了。

\n
\n

最终的树应该是这样的:

\n
$ tree -L 3\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 black_scholes\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 black_scholes\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Makefile\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bs.c\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .gitignore\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 _custom_build.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bs_test.py\n
Run Code Online (Sandbox Code Playgroud)\n
\n

使用src带有setup.py&的构建pyproject.toml

\n

更新:2022-11-14

\n

上面的过程非常混乱,并且根据您的使用方式也给出了不同的结果pip install。最后我完全改变了平面文件夹结构以使用src基于结构。现在的工作项目如下所示:

\n
# tree -L 3\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docs\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 examples\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 fbs_test.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 black_scholes\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Makefile\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 fbs.c\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .gitignore\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 LICENSE.md\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 clean.sh\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n

文件的内容是这样的:

\n
# setup.py\n\nfrom setuptools import setup, find_packages, Extension\n\next = Extension(\n    name                = \'black_scholes.fbs\',          # \'mypackage.mymodule\'\n    sources             = [\'src/lib/fbs.c\'],            # list of source files (to compile)\n    include_dirs        = [\'src/lib\'],                  # list of directories to search for C/C++ header files (in Unix form for portability)\n    py_limited_api      = True                          # opt-in flag for the usage of Python\'s limited API <python:c-api/stable>.\n)\n\nsetup_args = dict(\n    packages        = find_packages(where="src"),       # list \n    package_dir     = {"": "src"},                      # mapping\n    ext_modules     = [ext],                            # list\n    scripts         = ["examples/fbs_test.py"]          # list\n)\n\nsetup(**setup_args)\n
Run Code Online (Sandbox Code Playgroud)\n

\n
# pyproject.toml\n\n[build-system]\nrequires        = [\'setuptools>=61.0\']                  # \'cython\'\nbuild-backend   = \'setuptools.build_meta\'   \n\n[project]\nname            = \'black_scholes\'\n\n# ...\n\n[tool.setuptools]\npackage-dir = {"" = "src"}\n#py-modules = ["_custom_build"]\n\n[tool.setuptools.packages.find]\nwhere = ["src"]\n
Run Code Online (Sandbox Code Playgroud)\n

这里包名与目录名一致非常重要src/black_scholes。如果没有,即使在编译和安装包之后,您也会遇到各种非常奇怪的运行时错误。

\n


归档时间:

查看次数:

3832 次

最近记录:

2 年,11 月 前