Проблемы с перемещением модуля Python на основе f2py из numpy.distutils в scikit-build-core.Python

Программы на Python
Anonymous
Проблемы с перемещением модуля Python на основе f2py из numpy.distutils в scikit-build-core.

Сообщение Anonymous »

Я поддерживаю модуль Python под названием «Цыганенко», который в настоящее время имеет файл setup.py, как показано ниже:
from numpy.distutils.core import Extension, setup

ext = Extension('geopack',
sources=['src/tsyganenko/geopack_py.pyf',
'src/tsyganenko/geopack_py.f',
'src/tsyganenko/T96.f',
'src/tsyganenko/T02.f'])

with open("README.md", "r", encoding="utf-8") as f:
long_description = f.read()

setup(author="John Coxon and Sebastien de Larquier",
author_email="work@johncoxon.co.uk",
classifiers=[
"Development Status :: 4 - Beta",
"Intended Audience :: Science/Research",
"Natural Language :: English",
"Programming Language :: Python/Fortran"
],
description="A wrapper to call GEOPACK routines in Python.",
ext_modules=[ext],
install_requires=[
"numpy",
"matplotlib",
"pandas"
],
keywords=['Scientific/Space'],
long_description=long_description,
long_description_content_type="text/markdown",
name="Tsyganenko",
package_dir={"": "src"},
packages=setuptools.find_packages(where="src"),
python_requires=">=3.9",
url="https://github.com/johncoxon/tsyganenko",
version="2020.1",
)

Я пытаюсь перенести это на использование scikit-build-core, поскольку numpy.distutils устарел. Для этого я пытаюсь следовать документации scikit-build-core и получил pyproject.toml, который выглядит следующим образом:
[build-system]
requires = ["scikit-build-core", "numpy"]
build-backend = "scikit_build_core.build"

[project]
name = "Tsyganenko"
version = "2020.2"
dependencies = ["numpy"]

[tool.scikit-build]
ninja.version = ">=1.10"
cmake.version = ">=3.17.2"

[tool.setuptools.packages.find]
where = ["src"]

и файл CMakeLists.txt, который выглядит следующим образом:
cmake_minimum_required(VERSION 3.17.2...3.29)
project(${SKBUILD_PROJECT_NAME} LANGUAGES C Fortran)

find_package(
Python
COMPONENTS Interpreter Development.Module NumPy
REQUIRED)

# F2PY headers
execute_process(
COMMAND "${PYTHON_EXECUTABLE}" -c
"import numpy.f2py; print(numpy.f2py.get_include())"
OUTPUT_VARIABLE F2PY_INCLUDE_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE)

add_library(fortranobject OBJECT "${F2PY_INCLUDE_DIR}/fortranobject.c")
target_link_libraries(fortranobject PUBLIC Python::NumPy)
target_include_directories(fortranobject PUBLIC "${F2PY_INCLUDE_DIR}")
set_property(TARGET fortranobject PROPERTY POSITION_INDEPENDENT_CODE ON)

add_custom_command(
OUTPUT geopack_pymodule.c geopack_py-f2pywrappers.f
DEPENDS src/tsyganenko/geopack_py.f
VERBATIM
COMMAND "${Python_EXECUTABLE}" -m numpy.f2py
"${CMAKE_CURRENT_SOURCE_DIR}/src/tsyganenko/geopack_py.f" -m geopack_py --lower)

python_add_library(
geopack_py MODULE "${CMAKE_CURRENT_BINARY_DIR}/geopack_pymodule.c"
"${CMAKE_CURRENT_BINARY_DIR}/geopack_py-f2pywrappers.f"
"${CMAKE_CURRENT_SOURCE_DIR}/src/tsyganenko/geopack_py.f" WITH_SOABI)
target_link_libraries(geopack_py PRIVATE fortranobject)

install(TARGETS geopack_py DESTINATION .)

Он якобы успешно устанавливается, но при попытке импортировать модуль получаю следующую ошибку. Я недостаточно хорошо понимаю документацию scikit-build-core, чтобы иметь возможность ее отлаживать. Я совершенно уверен, что проблема в том, что T96.f и T02.f нигде не упоминаются в CMakeLists.txt, но я не уверен, как их добавить, и Я не уверен, нужно ли мне включать geopack_py.pyf. Может ли кто-нибудь помочь? Если вы хотите получить прямой доступ к коду, все это можно найти в ветке изменения настроек модуля на GitHub.
In [1]: import geopack_py
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
Cell In[1], line 1
----> 1 import geopack_py

ImportError: dlopen(/opt/homebrew/Caskroom/mambaforge/base/envs/test/lib/python3.12/site-packages/geopack_py.cpython-312-darwin.so, 0x0002): symbol not found in flat namespace '_t01_01_'


Подробнее здесь: https://stackoverflow.com/questions/790 ... t-build-co

Вернуться в «Python»