Распространять предварительно скомпилированный модуль расширения python с помощью distutils
-
20-09-2019 - |
Вопрос
Быстрый сегодня:Я изучаю входы и выходы библиотеки Pythons distutils, и я хотел бы включить модуль расширения python (.pyd) в свой пакет.Я, конечно, знаю, что рекомендуемый способ - заставить distutils скомпилировать расширение во время создания пакета, но это довольно сложное расширение, охватывающее множество исходных файлов и ссылающееся на несколько внешних библиотек, поэтому потребуется значительная работа, чтобы все заработало правильно.
Тем временем у меня есть известная рабочая сборка расширения, выходящая из Visual Studio, и я хотел бы использовать ее в установщике в качестве временного решения, позволяющего мне сосредоточиться на других проблемах.Однако я не могу указать его как модуль, поскольку они, по-видимому, должны иметь явное расширение .py .Как я мог бы указать в моем setup.py, что я хочу включить предварительно скомпилированный модуль расширения?
(Python 3.1, если это имеет значение)
Решение
Попробуйте создать шаблон манифеста:
http://docs.python.org/distutils/sourcedist.html#specifying-the-files-to-distribute
Другие советы
Я решил это, переопределив 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)
Попробуйте использовать package_data: http://docs.python.org/distutils/setupscript#installing-package-data