Python Distutils-如何在构建扩展时禁用包括调试符号

Python Distutils-如何在构建扩展时禁用包括调试符号,python,distutils,Python,Distutils,我已经编写了一个boostpython扩展,目前正在通过distutils构建该扩展 不幸的是,我无法在distutils中找到一种方法,在没有调试符号的情况下构建扩展,或者在安装时从扩展中剥离符号。 注意:我没有将--debug或-g传递给distutils的build命令(例如,pythonsetup.pybuild),我的编译器是Linux上的gcc setup.py示例: from distutils.core import setup from distutils.extension

我已经编写了一个boostpython扩展,目前正在通过distutils构建该扩展

不幸的是,我无法在distutils中找到一种方法,在没有调试符号的情况下构建扩展,或者在安装时从扩展中剥离符号。
注意:我没有将--debug或-g传递给distutils的build命令(例如,pythonsetup.pybuild),我的编译器是Linux上的gcc

setup.py示例:

from distutils.core import setup
from distutils.extension import Extension

setup(name="myPy",
      ext_modules = [
         Extension("MyPyExt", ["MyPyExt.cpp"],
                   libraries = ["boost_python"])
      ])

我找到了一种方法,但有点不对劲:

from distutils import sysconfig
from distutils.core import setup
import platform


if platform.system() != 'Windows':  # When compilinig con visual no -g is added to params
    cflags = sysconfig.get_config_var('CFLAGS')
    opt = sysconfig.get_config_var('OPT')
    sysconfig._config_vars['CFLAGS'] = cflags.replace(' -g ', ' ')
    sysconfig._config_vars['OPT'] = opt.replace(' -g ', ' ')

if platform.system() == 'Linux':  # In macos there seems not to be -g in LDSHARED
    ldshared = sysconfig.get_config_var('LDSHARED')
    sysconfig._config_vars['LDSHARED'] = ldshared.replace(' -g ', ' ')

setup(...)
您可以使用该选项将参数传递给编译器,这些参数最后追加,因此具有最高优先级。因此,如果在
extra\u compile\u args
中包含
-g0
(无调试符号),这将覆盖Distutils/Setuptools设置的
-g
。在您的示例中:

from distutils.core import setup
from distutils.extension import Extension

setup(
    name="myPy",
    ext_modules = [Extension(
        "MyPyExt",
        ["MyPyExt.cpp"],
        libraries = ["boost_python"],
        extra_compile_args = ["-g0"]
        )]
    )

另请参见:

@hithwen的解决方案与运行在MacOS 10.13.4上的MacPorts安装的python3.5配合良好

但是,
platform.system()
返回的是
'Darwin'
,在我的例子中不是'Linux'。
在Ubuntu 16.04上,
-g
似乎出现在开头或结尾。 所以稍微调整一下:

import sys
import re
from distutils import sysconfig
from distutils.core import setup, Extension

if sys.platform == 'linux' or sys.platform == 'darwin':
  sysconfig.get_config_var(None)  # to fill up _config_vars
  d = sysconfig._config_vars
  for x in ['OPT', 'CFLAGS', 'PY_CFLAGS', 'PY_CORE_CFLAGS', 'CONFIGURE_CFLAGS', 'LDSHARED']:
    d[x] = re.sub(' -g ', ' ', d[x])
    d[x] = re.sub('^-g ', '',  d[x])
    d[x] = re.sub(' -g$', '',  d[x])

setup(...)

谢谢@hithwen

您可以将
extra\u link\u args=['-Wl,--strip all']
添加到
扩展名中。不可移植,而且奇怪的是,Windows上的MinGW64默认会剥离生成的模块,但Linux上的gcc不会。哦,对不起,MinGW默认也不包括它,它仅在my
setup.py
中指定。确定。我试试看。上周末,我浏览了一些distutils包,但我还没能缩小到违约的范围。从我所看到的一切来看,它看起来不像是应该的。默认情况是在调用gcc构建调试时使用“-g”,而不需要我将--debug或-g传递给“python setup.py build/install”。这里的源代码中有一条相关的注释:考虑到我看到的使用iMake和cmake所做的事情,这对我来说并不坏。我将假设它可以工作,因为我无法访问我尝试执行此操作的原始代码。谢谢@hithwen,它与MacPorts安装的python3.5配合使用,运行在MacOS 10.13.4上。