Python Cython:pyximport:在pyximport.install中启用评测

Python Cython:pyximport:在pyximport.install中启用评测,python,python-3.x,profiling,cython,Python,Python 3.x,Profiling,Cython,我的Python 3项目经常使用cython 在生产部署中,我使用了一个构建脚本,其中包括禁用分析: from distutils.core import setup from Cython.Build import cythonize import os compiler_directives = { 'language_level': 3, 'optimize.use_switch': True, 'profile': True, } setup( pac

我的Python 3项目经常使用cython

在生产部署中,我使用了一个构建脚本,其中包括禁用分析:

from distutils.core import setup
from Cython.Build import cythonize
import os

compiler_directives = {
    'language_level': 3,
    'optimize.use_switch': True,
    'profile': True,
}

setup(
    packages=["XXXXXX"],
    ext_modules=cythonize(
        module_list="**/*.pyx",
        compiler_directives=compiler_directives,
    )
)
在开发中,我使用pyximport。为了区分这两个上下文,我正在测试“生产”用户是否在项目的顶级
\uuuu init\uuuu.py
文件中使用。如果这不是生产,我使用的是
pyximport;pyximport.install
,使其变得完全透明:

if getpass.getuser != PRODUCTION_USER_NAME:
    import pyximport
    pyximport.install(
        pyximport=True,
        pyimport=False,
        build_dir=None,
        build_in_temp=True,
        setup_args={},
        reload_support=False,
        load_py_module_on_import_failure=False,
        inplace=False,
        language_level=3,
    )
我想在开发环境中为所有cython文件启用评测。我试图将
profile=True
参数添加到
piximport.install
语句中,但它不起作用

我怎样才能继续

一些补充意见:

  • 我希望避免在开发过程中在所有源代码中推送
    Profile=True
    ,并在提交之前删除它们

  • 使用
    .pyxbld
    文件对我来说不是一个选项,因为我有46个pyx文件,并计划有更多。。。除非有办法只设置一个文件来支持所有pyx,就像我为构建脚本所做的那样,但我没有找到方法


感谢您的帮助。

它需要包装pyximport的一个内部函数,但这可以通过以下方式完成:

#允许通过cython/pyximport将.pyx文件与
#默认编译器指令。
导入功能工具
导入pyximport.pyximport
#Hack pyximport具有用于分析和嵌入签名的默认选项
#在文档字符串中。
#只要pyximport需要构建文件,它就会调用
#pyximport.pyximport.get\u distutils\u扩展名。此函数返回一个对象
#它有一个cython_指令属性,可以设置为
#cython的编译器指令。
_旧的\u get\u distutils\u扩展=pyximport.pyximport.get\u distutils\u扩展
@functools.wrapps(\u old\u get\u distutils\u扩展名)
def_get_distutils_extension_new(*args,**kwargs):
扩展模块,设置模块=\u旧模块\u获取模块\u扩展模块(*args,**kwargs)
如果不是hasattr(扩展模块“cython指令”):
扩展_mod.cython_指令={}
extension\u mod.cython\u directives.setdefault('embedsignature',True)
extension\u mod.cython\u directives.setdefault('profile',True)
返回扩展模块、设置参数
pyximport.pyximport.get\u distutils\u extension=\u get\u distutils\u extension\u new
pyximport.install()

请注意,这不会强制使用新选项重新编译未更改的模块;您必须触摸这些文件,才能使用新配置触发编译。

这里有一种显然未记录的传递指令的方法:

pyximport.install(setup_args={
    'options': {
        'build_ext': {
            'cython_directives': {
                'language_level': 3,
                'optimize.use_switch': True,
                'profile': True,
            }
        }
    }
})
我在cython/Distutils/build\u ext.py中找到了
cython\u指令
name