Я использую MacO.
Я столкнулся с проблемой: когда я создаю только файл .so и связываю его в Python следующим образом, все функции работают так, как задумано:
Код: Выделить всё
import sys
sys.path.append("python/easyPyEngine")
import easyPyEngine
Код: Выделить всё
pip install .whl
Когда я запускаю это на Python:
Код: Выделить всё
print(dir(easyPyEngine))
- Если это работает:
Код: Выделить всё
['Engine', 'Sprite', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
- Если не удалось:
Код: Выделить всё
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
Если есть лучший и/или более простой способ собрать его для распространения, не стесняйтесь сообщить мне!
Структура проекта
Код: Выделить всё
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
Код: Выделить всё
content of the wheel fileКод: Выделить всё
['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://github.com/Jean1000levrai/EasyPyEngine
При необходимости не стесняйтесь задавать мне любые вопросы.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -dont-work
Мобильная версия