如何使用构建包从包含多个 .pyx 文件的 Cython 文件 (.pyx) 创建单个 Python 包

问题描述 投票:0回答:1

我正在尝试在一个包名称下构建一个包含 Cython 函数集合的 python 包,使用 Cython 中的 include 语句,遵循 this 的想法。

这是文件组织(根目录有子目录

mypkg
):

  • setup.py
from Cython.Distutils.build_ext import new_build_ext
from setuptools import setup
from setuptools.extension import Extension

ext_modules = [
Extension(
"mypkg.main",
sources=["mypkg/main.pyx"],
),
]

setup(
ext_modules=ext_modules,
cmdclass={"build_ext": new_build_ext},
requires=['cython'],
)
  • pyproject.toml
[build-system]
build-backend = "setuptools.build_meta"
requires = [
"setuptools>=64.0.0",
"cython>=3.0.0",
"tomli",
]

[project]
name = "mypkg"
version = "0.1.0"
description = "Simple Cython example with multiple included .pyx files"
  • mypkg/main.pyx
include "add.pyx"
include "prod.pyx"
  • mypkg/add.pyx
def add(float a, float b):
    return a + b
  • mypkg/prod.pyx
def prod(float a, float b):
    return a * b
  • mypkg/__init__.py
  • mypkg/__init__.pxd

使用此文件结构,当我尝试构建 Python 包时,cython

build_ext
模块无法找到包含文件,
add.pyx
。我在这里缺少什么以及如何构建包
mypkg
并能够在Python中导入和使用函数add()和prod()?
我正在使用:

  • python 3.8.16
    .
  • Cython 3.0.2
  • setuptools 67.8.0
  • build
    包裹来自
    pip install build

这是错误消息:

(...)
running build_ext
Traceback (most recent call last):
  File "/opt/conda/envs/py_3.8/lib/python3.8/site-packages/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
    main()
  File "/opt/conda/envs/py_3.8/lib/python3.8/site-packages/pyproject_hooks/_in_process/_in_process.py", line 335, in main
    json_out['return_val'] = hook(**hook_input['kwargs'])
  File "/opt/conda/envs/py_3.8/lib/python3.8/site-packages/pyproject_hooks/_in_process/_in_process.py", line 251, in build_wheel
    return _build_backend().build_wheel(wheel_directory, config_settings,
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/build_meta.py", line 434, in build_wheel
    return self._build_with_temp_dir(
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/build_meta.py", line 419, in _build_with_temp_dir
    self.run_setup()
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/build_meta.py", line 341, in run_setup
    exec(code, locals())
  File "<string>", line 13, in <module>
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/__init__.py", line 103, in setup
    return distutils.core.setup(**attrs)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/core.py", line 185, in setup
    return run_commands(dist)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/core.py", line 201, in run_commands
    dist.run_commands()
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/dist.py", line 969, in run_commands
    self.run_command(cmd)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/dist.py", line 989, in run_command
    super().run_command(command)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/dist.py", line 988, in run_command
    cmd_obj.run()
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/wheel/bdist_wheel.py", line 364, in run
    self.run_command("build")
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/cmd.py", line 318, in run_command
    self.distribution.run_command(command)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/dist.py", line 989, in run_command
    super().run_command(command)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/dist.py", line 988, in run_command
    cmd_obj.run()
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/command/build.py", line 131, in run
    self.run_command(cmd_name)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/cmd.py", line 318, in run_command
    self.distribution.run_command(command)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/dist.py", line 989, in run_command
    super().run_command(command)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/dist.py", line 988, in run_command
    cmd_obj.run()
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/command/build_ext.py", line 345, in run
    self.build_extensions()
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/command/build_ext.py", line 467, in build_extensions
    self._build_extensions_serial()
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/setuptools/_distutils/command/build_ext.py", line 493, in _build_extensions_serial
    self.build_extension(ext)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/Cython/Distutils/build_ext.py", line 122, in build_extension
    new_ext = cythonize(
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/Cython/Build/Dependencies.py", line 990, in cythonize
    module_list, module_metadata = create_extension_list(
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/Cython/Build/Dependencies.py", line 839, in create_extension_list
    kwds = deps.distutils_info(file, aliases, base).values
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/Cython/Build/Dependencies.py", line 691, in distutils_info
    return (self.transitive_merge(filename, self.distutils_info0, DistutilsInfo.merge)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/Cython/Build/Dependencies.py", line 700, in transitive_merge
    return self.transitive_merge_helper(
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/Cython/Build/Dependencies.py", line 706, in transitive_merge_helper
    deps = extract(node)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/Cython/Build/Dependencies.py", line 671, in distutils_info0
    cimports, externs, incdirs = self.cimports_externs_incdirs(filename)
  File "Cython/Utils.py", line 129, in Cython.Utils.cached_method.wrapper
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/Cython/Build/Dependencies.py", line 558, in cimports_externs_incdirs
    for include in self.included_files(filename):
  File "Cython/Utils.py", line 129, in Cython.Utils.cached_method.wrapper
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/Cython/Build/Dependencies.py", line 540, in included_files
    include_path = self.context.find_include_file(include, source_file_path=filename)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/Cython/Compiler/Main.py", line 302, in find_include_file
    error(pos, "'%s' not found" % filename)
  File "/tmp/build-env-q2v7shn5/lib/python3.8/site-packages/Cython/Compiler/Errors.py", line 178, in error
    raise InternalError(message)
Cython.Compiler.Errors.InternalError: Internal compiler error: 'add.pyx' not found

ERROR Backend subprocess exited when trying to invoke build_wheel

我期待构建一个 python pakcage

mypkg
,并能够在 Python 中将包导入为
import mypkg.main
并运行两个函数:
mypkg.main.add(1.0, 2.0)
mypkg.main.prod(2.0, 3.0)
。实际发生的情况是构建过程无法找到包含的文件
add.pyx
并且构建失败。

python cython setuptools distutils
1个回答
0
投票

也许可以尝试修改 setup.py 和 main.pyx 以进行以下更改。

$ diff setup.py setup.py.orig
8,9c8
< #sources=["mypkg/main.pyx"],
< sources=["mypkg/main.pyx", "mypkg/add.pyx", "mypkg/prod.pyx"],
---
> sources=["mypkg/main.pyx"],

$ diff mypkg/main.pyx.orig mypkg/main.pyx
1,2c1,2
< include "add.pyx"
< include "prod.pyx"
---
> from .add import add
> from .prod import prod

$ tree
.
├── mypkg
│   ├── add.c
│   ├── add.pyx
│   ├── __init__.py
│   ├── main.c
│   ├── main.pyx
|   ├── main.pyx.orig
│   ├── prod.c
│   └── prod.pyx
├── pyproject.toml
├── setup.py
└── setup.py.orig

然后它似乎建立了:

$ python setup.py build_ext --inplace
running build_ext
Warning: Multiple cython sources found for extension 'mypkg.main': ['mypkg/main.pyx', 'mypkg/add.pyx', 'mypkg/prod.pyx']
See https://cython.readthedocs.io/en/latest/src/userguide/sharing_declarations.html for sharing declarations among Cython files.
building 'mypkg.main' extension
gcc -pthread -B /home/user/miniconda3/envs/pytorch/compiler_compat -Wno-unused-result -Wsign-compare -DNDEBUG -fwrapv -O2 -Wall -fPIC -O2 -isystem /home/user/miniconda3/envs/pytorch/include -fPIC -O2 -isystem /home/user/miniconda3/envs/pytorch/include -fPIC -I/home/user/miniconda3/envs/pytorch/include/python3.8 -c mypkg/add.c -o build/temp.linux-x86_64-cpython-38/mypkg/add.o
gcc -pthread -B /home/user/miniconda3/envs/pytorch/compiler_compat -Wno-unused-result -Wsign-compare -DNDEBUG -fwrapv -O2 -Wall -fPIC -O2 -isystem /home/user/miniconda3/envs/pytorch/include -fPIC -O2 -isystem /home/user/miniconda3/envs/pytorch/include -fPIC -I/home/user/miniconda3/envs/pytorch/include/python3.8 -c mypkg/main.c -o build/temp.linux-x86_64-cpython-38/mypkg/main.o
gcc -pthread -B /home/user/miniconda3/envs/pytorch/compiler_compat -Wno-unused-result -Wsign-compare -DNDEBUG -fwrapv -O2 -Wall -fPIC -O2 -isystem /home/user/miniconda3/envs/pytorch/include -fPIC -O2 -isystem /home/user/miniconda3/envs/pytorch/include -fPIC -I/home/user/miniconda3/envs/pytorch/include/python3.8 -c mypkg/prod.c -o build/temp.linux-x86_64-cpython-38/mypkg/prod.o
gcc -pthread -B /home/user/miniconda3/envs/pytorch/compiler_compat -shared -Wl,--allow-shlib-undefined -Wl,-rpath,/home/user/miniconda3/envs/pytorch/lib -Wl,-rpath-link,/home/user/miniconda3/envs/pytorch/lib -L/home/user/miniconda3/envs/pytorch/lib -Wl,--allow-shlib-undefined -Wl,-rpath,/home/user/miniconda3/envs/pytorch/lib -Wl,-rpath-link,/home/user/miniconda3/envs/pytorch/lib -L/home/user/miniconda3/envs/pytorch/lib build/temp.linux-x86_64-cpython-38/mypkg/add.o build/temp.linux-x86_64-cpython-38/mypkg/main.o build/temp.linux-x86_64-cpython-38/mypkg/prod.o -o /home/user/younseo/mypkg/main.cpython-38-x86_64-linux-gnu.so
© www.soinside.com 2019 - 2024. All rights reserved.