Пользовательский python модуль начальной загрузки .so файла intead .dylib - PullRequest
1 голос
/ 20 января 2020

Я делаю пользовательский модуль Python 3.7, скомпилированный с CMake (на OSX). Он прекрасно компилирует модуль в dylib, однако когда я запускаю эту команду:

python3.7 setup.py install

Загрузочный файл, который генерируется в файле яйца, выглядит следующим образом:

def __bootstrap__():
    global __bootstrap__, __loader__, __file__
    import sys, pkg_resources, imp
    __file__ = pkg_resources.resource_filename(__name__, 'spexi.cpython-37m-darwin.so')
    __loader__ = None; del __bootstrap__, __loader__
    imp.load_dynamic(__name__,__file__)
__bootstrap__()

Однако файл spexi.cpython-37m-darwin.so не существует, вместо него следует прочитать spexi.dylib. Если я изменю его вручную, я смогу выполнить код нормально.

Сценарий setup.py выглядит следующим образом: https://pastebin.com/sMWnJRdn

Как получить сценарий начальной загрузки для создания с правильной ссылкой на файл dylib?

Вот результат выполнения сценария setup.py:

➜  spexi-gis-py python3.7 setup.py install
running install
running bdist_egg
running egg_info
writing spexi.egg-info/PKG-INFO
writing dependency_links to spexi.egg-info/dependency_links.txt
writing top-level names to spexi.egg-info/top_level.txt
reading manifest file 'spexi.egg-info/SOURCES.txt'
writing manifest file 'spexi.egg-info/SOURCES.txt'
installing library code to build/bdist.macosx-10.9-x86_64/egg
running install_lib
running build_ext
cmake /Users/colinbasnett/spexi-gis-py -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/colinbasnett/spexi-gis-py/build/lib.macosx-10.9-x86_64-3.7 -DCMAKE_BUILD_TYPE=Release
-- The C compiler identification is AppleClang 11.0.0.11000033
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Found Python: /Library/Frameworks/Python.framework/Versions/3.7/lib/libpython3.7m.dylib (found version "3.7") found components: Development
-- Found TIFF: /usr/local/lib/libtiff.dylib (found version "4.0.10")
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/colinbasnett/spexi-gis-py/build/temp.macosx-10.9-x86_64-3.7
cmake --build . --config Release -- -j4
Scanning dependencies of target spexi
[ 50%] Building C object CMakeFiles/spexi.dir/src/vincenty.c.o
[ 50%] Building C object CMakeFiles/spexi.dir/src/dem.c.o
[ 75%] Building C object CMakeFiles/spexi.dir/src/spexi.c.o
[100%] Linking C shared library ../lib.macosx-10.9-x86_64-3.7/spexi.dylib
[100%] Built target spexi
creating build/bdist.macosx-10.9-x86_64
creating build/bdist.macosx-10.9-x86_64/egg
copying build/lib.macosx-10.9-x86_64-3.7/spexi.dylib -> build/bdist.macosx-10.9-x86_64/egg
creating build/bdist.macosx-10.9-x86_64/egg/spexi.cpython-37m-darwin.so
creating stub loader for spexi.cpython-37m-darwin.so
byte-compiling build/bdist.macosx-10.9-x86_64/egg/spexi.py to spexi.cpython-37.pyc
creating build/bdist.macosx-10.9-x86_64/egg/EGG-INFO
copying spexi.egg-info/PKG-INFO -> build/bdist.macosx-10.9-x86_64/egg/EGG-INFO
copying spexi.egg-info/SOURCES.txt -> build/bdist.macosx-10.9-x86_64/egg/EGG-INFO
copying spexi.egg-info/dependency_links.txt -> build/bdist.macosx-10.9-x86_64/egg/EGG-INFO
copying spexi.egg-info/top_level.txt -> build/bdist.macosx-10.9-x86_64/egg/EGG-INFO
writing build/bdist.macosx-10.9-x86_64/egg/EGG-INFO/native_libs.txt
zip_safe flag not set; analyzing archive contents...
__pycache__.spexi.cpython-37: module references __file__
creating 'dist/spexi-1.0.0-py3.7-macosx-10.9-x86_64.egg' and adding 'build/bdist.macosx-10.9-x86_64/egg' to it
removing 'build/bdist.macosx-10.9-x86_64/egg' (and everything under it)
Processing spexi-1.0.0-py3.7-macosx-10.9-x86_64.egg
removing '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/spexi-1.0.0-py3.7-macosx-10.9-x86_64.egg' (and everything under it)
creating /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/spexi-1.0.0-py3.7-macosx-10.9-x86_64.egg
Extracting spexi-1.0.0-py3.7-macosx-10.9-x86_64.egg to /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages
spexi 1.0.0 is already the active version in easy-install.pth

Installed /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/spexi-1.0.0-py3.7-macosx-10.9-x86_64.egg
Processing dependencies for spexi==1.0.0
Finished processing dependencies for spexi==1.0.0

setup.py

import os
import pathlib
from setuptools import setup, Extension
from setuptools.command.build_ext import build_ext as build_ext_orig


class CMakeExtension(Extension):
    def __init__(self, name, cmake_lists_dir='.', **kwa):
        Extension.__init__(self, name, sources=[], **kwa)
        self.cmake_lists_dir = os.path.abspath(cmake_lists_dir)


class build_ext(build_ext_orig):
    def run(self):
        for ext in self.extensions:
            self.build_cmake(ext)
        super().run()

    def build_cmake(self, ext):
        cwd = pathlib.Path().absolute()

        # these dirs will be created in build_py, so if you don't have
        # any python sources to bundle, the dirs will be missing
        build_temp = pathlib.Path(self.build_temp)
        build_temp.mkdir(parents=True, exist_ok=True)
        extdir = pathlib.Path(self.get_ext_fullpath(ext.name))
        extdir.mkdir(parents=True, exist_ok=True)

        # example of cmake args
        config = 'Debug' if self.debug else 'Release'
        cmake_args = [
            '-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + str(extdir.parent.absolute()),
            '-DCMAKE_BUILD_TYPE=' + config
        ]

        # example of build args
        build_args = [
            '--config', config,
            '--', '-j4'
        ]

        os.chdir(str(build_temp))
        self.spawn(['cmake', str(cwd)] + cmake_args)
        if not self.dry_run:
            self.spawn(['cmake', '--build', '.'] + build_args)
        os.chdir(str(cwd))


def main():
    setup(name="spexi",
          version="1.0.0",
          author="Colin Basnett",
          ext_modules=[CMakeExtension('spexi')],
          package_data={'python_package': ['*.dylib']},
          cmdclass={
              'build_ext': build_ext,
          })


if __name__ == "__main__":
    main()

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.15)
PROJECT(spexi)

SET(CMAKE_CXX_STANDARD 14)

FIND_PACKAGE(Python 3.5 COMPONENTS Development)
INCLUDE_DIRECTORIES(${Python_INCLUDE_DIRS})
LINK_LIBRARIES(${Python_LIBRARIES})

FIND_PACKAGE(TIFF REQUIRED)
INCLUDE_DIRECTORIES(${TIFF_INCLUDE_DIR})
LINK_LIBRARIES(${TIFF_LIBRARIES})

SET(SRC src/vincenty.h src/data.h src/dem.h src/vincenty.cpp src/dem.cpp src/spexi.cpp src/draw.h src/draw.cpp)

ADD_LIBRARY(spexi SHARED ${SRC})
SET_TARGET_PROPERTIES(
        spexi
        PROPERTIES
        PREFIX ""
        OUTPUT_NAME "spexi"
        LINKER_LANGUAGE "CXX"
)

1 Ответ

0 голосов
/ 29 января 2020

Вы можете исправить это, используя следующую команду в CMakeLists.txt:

SET(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
...