2010-03-15 4 views
16

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

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

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

ответ

5

Я решил эту проблему путем переопределения 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

Очень приятно! В ответе также следует указать запись расширения, которая входит в 'setup (..)': 'ext_modules = [Extension (" _ my_extension ", sources = [])]' – letmaik

Смежные вопросы