not*_*bit 4 python compilation setup.py pyproject.toml
我遇到了这个小项目,用于创建要在 python 中使用的Black-Scholes函数的 C 编译版本。
\n尽管示例代码似乎已于今年 7 月发布,但setup.py构建的使用类型似乎已在旧版构建之外被弃用。任何编译失败,首先抱怨缺少MS C++ 14编译器(这不是真的),然后进一步调查,似乎表明 setup.py 不能再使用。
问:如何将其转换setup.py为有效pyproject.toml文件?
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)\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n可能相关的问题:
\n\n在浪费了 2 天时间试图规避所需的Visual StudioC++ Build tools要求之后,唯一不幸的可行选择是提交下载,>7GB以便让我的 20 行 C 函数在Py3.10. (按照这个。)
_custom_build.py以下是有效的文件:
\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)\nRun Code Online (Sandbox Code Playgroud)\n然后对于pyproject.toml:
# 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"\nRun Code Online (Sandbox Code Playgroud)\n这是使用一个名为 的外部构建文件_custom_build.py,如上面的 SO 链接所建议的。
# _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 )\nRun Code Online (Sandbox Code Playgroud)\n然而,似乎extra_compile_args完全被忽略了......
\n\n如果有人能够提出使用较小的编译器进行构建的替代解决方案,就像
\nMinGW这样,那就太好了。
最终的树应该是这样的:
\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\nRun Code Online (Sandbox Code Playgroud)\nsrc带有setup.py&的构建pyproject.toml更新:2022-11-14
\n上面的过程非常混乱,并且根据您的使用方式也给出了不同的结果pip install。最后我完全改变了平面文件夹结构以使用src基于结构。现在的工作项目如下所示:
# 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\nRun 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)\nRun 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"]\nRun Code Online (Sandbox Code Playgroud)\n这里包名与目录名一致非常重要src/black_scholes。如果没有,即使在编译和安装包之后,您也会遇到各种非常奇怪的运行时错误。
| 归档时间: |
|
| 查看次数: |
3832 次 |
| 最近记录: |