Почему, когда я собираю свою библиотеку Python из кода C, функции Python не работаютPython

Программы на Python
Ответить
Anonymous
 Почему, когда я собираю свою библиотеку Python из кода C, функции Python не работают

Сообщение Anonymous »

Я пытаюсь собрать библиотеку Python из кода C. Я использую macOS.
Когда я создаю файл .so и связываю его с Python следующим образом, все функции работают так, как задумано:

Код: Выделить всё

import sys
sys.path.append("python/easyPyEngine")
import easyPyEngine
Но если я попытаюсь собрать его с помощью scikit, создать файл .whl и затем установить его с помощью:

Код: Выделить всё

pip install .whl
Я все еще могу импортировать модуль, но функции исчезли.
Когда я запускаю это на Python:

Код: Выделить всё

print(dir(easyPyEngine))
Я получаю следующие результаты:
  • Если это работает:

    Код: Выделить всё

    ['Engine', 'Sprite', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
    
  • Если не удалось:

    Код: Выделить всё

    ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
    
Типы Engine и Sprite должны появиться в рабочей версии.
Структура проекта:

Код: Выделить всё

easyPyEngine/
├── CMakeLists.txt
├── pyproject.toml
├── build/
├── dist/
|     └── easyPyEngine.whl
├── python/
│   └── easyPyEngine/
│   |   ├── __init__.py
|   |   └── easyPyEngine.so
│   └── easyPyEngine.c
├── src/
│   └── *.c
├── include/
│   └--- *.h

Код: Выделить всё

CMakeLists.txt

Код: Выделить всё

cmake_minimum_required(VERSION 3.16)
project(easyPyEngine C)

set(CMAKE_C_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# Python
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)

# SDL2
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2)
pkg_check_modules(SDL2_IMAGE REQUIRED SDL2_image)

file(GLOB SRC_FILES src/*.c)
add_library(easyPyEngine MODULE ${SRC_FILES} python/easyPyEngine.c)

# so name
set_target_properties(easyPyEngine PROPERTIES
PREFIX ""
SUFFIX ".so"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/python/easyPyEngine"
LINK_FLAGS "-undefined dynamic_lookup"
)

# Includes
target_include_directories(easyPyEngine PRIVATE
${Python3_INCLUDE_DIRS}
${SDL2_INCLUDE_DIRS}
${SDL2_IMAGE_INCLUDE_DIRS}
include
)

# libraries
if (APPLE)
# Explicit paths (mac)
set(SDL2_LIB /opt/homebrew/lib/libSDL2.dylib)
set(SDL2_IMAGE_LIB /opt/homebrew/lib/libSDL2_image.dylib)
target_link_libraries(easyPyEngine PRIVATE
${Python3_LIBRARIES}
${SDL2_LIB}
${SDL2_IMAGE_LIB}
)

set_target_properties(easyPyEngine PROPERTIES
INSTALL_RPATH "@loader_path"
BUILD_WITH_INSTALL_RPATH ON
)
endif()

if (LINUX)
# Explicit paths (linux)
set(SDL2_LIB_PATH /usr/lib/x86_64-linux-gnu/libSDL2.so)
set(SDL2_IMAGE_LIB_PATH /usr/lib/x86_64-linux-gnu/libSDL2_image.so)
endif()

if (WIN32)
# N E E D S   A D J U S T E M E N T S
set(SDL2_LIB_PATH "C:/SDL2/lib/x64/SDL2.lib")
set(SDL2_IMAGE_LIB_PATH "C:/SDL2_image/lib/x64/SDL2_image.lib")
endif()

# target_link_libraries(easyPyEngine PRIVATE
#     ${Python3_LIBRARIES}
#     ${SDL2_LIB_PATH}
#     ${SDL2_IMAGE_LIB_PATH}
# )

Код: Выделить всё

pyproject.toml
:

Код: Выделить всё

[build-system]
requires = ["scikit-build-core>=0.9.0", "setuptools", "wheel"]
build-backend = "scikit_build_core.build"

[project]
name = "easyPyEngine"
version = "0.1.0"
description = "Minimal 2D C-based Python game engine"
readme = "README.md"
license = { text = "MIT"  }
requires-python = ">=3.9"

[tool.scikit-build]
wheel.packages = ["python/easyPyEngine"]
cmake.verbose = true
Содержимое файла колеса:

Код: Выделить всё

['easyPyEngine/__init__.py',
'easyPyEngine/easyPyEngine.so',
'easyPyEngine/libSDL2-2.0.0.dylib',
'easyPyEngine/libSDL2.dylib',
'easyPyEngine/libSDL2_image-2.0.0.dylib',
'easyPyEngine/libSDL2_image.dylib',
'easypyengine-0.1.0.dist-info/METADATA',
'easypyengine-0.1.0.dist-info/WHEEL',
'easypyengine-0.1.0.dist-info/top_level.txt',
'easypyengine-0.1.0.dist-info/RECORD']
При необходимости здесь находится репозиторий проекта.


Подробнее здесь: https://stackoverflow.com/questions/798 ... -dont-work
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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