使distutils在正确的文件夹中放置已编译的扩展

时间:2019-02-23 10:00:09

标签: python distutils

我编写了一个使用distutils构建的Python C扩展。这是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 :(得分:1)

  

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},
    …
)

,但是您必须通过任何方式决定将已编译模块移至何处。