![](/img/trans.png)
[英]Place pre-compiled extensions in root folder of non-pure Python Wheel package
[英]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.