繁体   English   中英

使 distutils 将编译后的扩展放在正确的文件夹中

[英]Make distutils place compiled extensions in the right folder

我写了一个 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 文件导入的方式编译扩展的正确方法是什么?

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

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

只是为了更新2022年的信息~

如果您想在开发包的项目中测试您的模块,我认为更改扩展名然后使用--inplace<\/code>标志就足够了。

例如,如果this_package<\/code>是您的扩展,并且您希望您的包结构如下:

project_dir
    |-- package
    |   |-- __init__.py
    |   |-- this_package.xxxx.so
    |   |-- other.py
    |-- setup.py

我认为将扩展名更改为<path>.<to>.<package>.<extension_name>会将其放置在您想要的目录中。 例如:

from distutils.core import setup, Extension

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

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

utils扩展放在package package 下

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM