Распространение предварительно скомпилированного модуля расширения Python с помощью distutils - PullRequest
16 голосов
/ 15 марта 2010

Быстрый сегодня: я изучаю входящие и исходящие файлы библиотеки Pythons distutils, и я хотел бы включить модуль расширения Python (.pyd) в свой пакет. Я знаю, конечно, что рекомендованный способ - это distutils скомпилировать расширение во время создания пакета, но это довольно сложное расширение, охватывающее множество исходных файлов и ссылающееся на несколько внешних библиотек, так что для получения всего понадобится немало игр работает правильно.

Тем временем у меня есть известная рабочая сборка расширения, выходящая из Visual Studio, и я хотел бы использовать его в установщике как временное решение, чтобы позволить мне сосредоточиться на других проблемах. Однако я не могу указать его как модуль, поскольку он, очевидно, должен иметь явное расширение .py. Как я могу указать в своем файле setup.py, что я хочу включить предварительно скомпилированный модуль расширения?

(Python 3.1, если это имеет значение)

Ответы [ 3 ]

7 голосов
/ 15 марта 2010
6 голосов
/ 17 августа 2012

Я решил это, переопределив Extension.build_extension:

setup_args = { ... }
if platform.system() == 'Windows':
    class my_build_ext(build_ext):
        def build_extension(self, ext):
            ''' Copies the already-compiled pyd
            '''
            import shutil
            import os.path
            try:
                os.makedirs(os.path.dirname(self.get_ext_fullpath(ext.name)))
            except WindowsError, e:
                if e.winerror != 183: # already exists
                    raise


            shutil.copyfile(os.path.join(this_dir, r'..\..\bin\Python%d%d\my.pyd' % sys.version_info[0:2]), self.get_ext_fullpath(ext.name))

    setup_args['cmdclass'] = {'build_ext': my_build_ext }

setup(**setup_args)
0 голосов
/ 10 октября 2011

Попробуйте использовать package_data: http://docs.python.org/distutils/setupscript#installing-package-data

...