2010-03-15 122 views
16

今天快速:我正在学习Pythons distutils库的in和out,我想在我的软件包中包含一个python扩展模块(.pyd)。我当然知道建议的方法是在创建包时使用distutils编译扩展,但这是一个相当复杂的扩展,跨越多个源文件并引用多个外部库,因此需要一些重要的播放才能获取所有内容正确的工作。使用distutils分配预编译的python扩展模块

与此同时,我有一个来自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 2017-08-31 11:09:49

相关问题