Заставьте distutils поместить скомпилированные расширения в нужную папку - PullRequest
0 голосов
/ 23 февраля 2019

Я написал расширение Python C, которое я создаю с помощью distutils.Это setup.py:

from distutils.core import setup, Extension

utilsmodule = Extension('utils', sources = ['utilsmodule.c'])

setup (name = 'myPackage',
       version = '1.0',
       description = 'My package',
       ext_modules = [utilsmodule])

Когда я запускаю python setup.y build, расширение создается правильно, но файл .pyd помещается в папку build/lib.win-amd64-3.7, а не в корень модуля, куда смотрит Pythonдля модулей для импорта.Мне нужно переместить этот файл из build после сборки, чтобы иметь возможность его импортировать.

Я думал добавить строку после setup(), которая перемещает файл, но это выглядит немного грязно, яЯ предполагаю, что distutils должен выполнять эту работу.

Как правильно скомпилировать расширение таким образом, чтобы оно могло быть импортировано другими файлами Python сразу после сборки?

1 Ответ

0 голосов
/ 23 февраля 2019

distutils должен делать эту работу.

Не должен.Сборка - это всего лишь промежуточный этап для упаковки, установки и использования.

Как правильно скомпилировать расширение так, чтобы оно могло быть импортировано другими файлами Python сразу после сборки?

Такого пути нет.Вы можете установить %PYTHONPATH%, чтобы указать build/lib.win-amd64-3.7, и импортировать модуль напрямую из build/.

. Или вы можете попытаться согнуть distutils:

from distutils.core import setup
from distutils.command.build_ext import build_ext as _build_ext
import os

class build_ext(_build_ext):
    def run(self):
        _build_ext.run(self)
        os.rename("build/lib.win-amd64-3.7/%s" % mypydname, dest_dir)

setup(
    …
    cmdclass={'build_ext': build_ext},
    …
)

, но любым другим способом.решить, куда перемещать скомпилированный модуль.

...