当前位置: 首页 > 面试题库 >

如何从cython设置文件中删除-pthread编译器标志

长孙朝明
2023-03-14
问题内容

在linux环境中,当我运行cython的安装脚本时,我得到

gcc -pthread -B /apps/.../compiler_compat -Wl,-sysroot=/ -Wsign-compare 
-DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/ap......

就我而言,我想删除pthread选项。如何通过cython设置文件来做到这一点?我看到有添加编译器标志的选项,但是没有要删除的选项。我的安装文件:

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

from distutils.extension import Extension

extensions = [Extension("foo",sources = ["foo.pyx"])]

setup(ext_modules = cythonize(extensions))

问题答案:

正如@DavidW指出的那样,对于许多选项,还有一个选项可以对其进行否定/覆盖,而命令行上的最后一个选项“
wins”。因此,例如添加额外的编译选项-Os将否决默认设置-O2-O3,因为-Os它将-O2在命令行之后出现(-fwrapv/-fno- wrapv这样的对的另一个示例)。

但是,-pthread没有这样的“伙伴”,并且禁用它的唯一机会是完全防止其出现在命令行中。做到这一点的方法有些怪异,但这不是我们所有人都使用python的原因吗?

distutils用于distutils.sysconfig查找正确的编译/链接标志。一种可能性是修改其功能,以便将-pthread其过滤掉。

我选择get_config_vars,但是当然还有其他选择。该计划很简单:

  1. wrap distutils.sysconfig.get_config_vars,以便将-pthread其过滤掉
  2. distutils.sysconfig.get_config_vars用包装纸代替
  3. 否则,setup.py保持不变

这导致以下结果setup.py

# manipulate get_config_vars:
# 1. step: wrap functionality and filter
from distutils.sysconfig import get_config_vars as default_get_config_vars

def remove_pthread(x):
    if type(x) is str:
        # x.replace(" -pthread ") would be probably enough...
        # but we want to make sure we make it right for every input
        if x=="-pthread":
            return ""
        if x.startswith("-pthread "):
            return remove_pthread(x[len("-pthread "):])
        if x.endswith(" -pthread"):
            return remove_pthread(x[:-len(" -pthread")])
        return x.replace(" -pthread ", " ")
    return x

def my_get_config_vars(*args):
  result = default_get_config_vars(*args)
  # sometimes result is a list and sometimes a dict:
  if type(result) is list:
     return [remove_pthread(x) for x in result]
  elif type(result) is dict:
     return {k : remove_pthread(x) for k,x in result.items()}
  else:
     raise Exception("cannot handle type"+type(result))

# 2.step: replace    
import distutils.sysconfig as dsc
dsc.get_config_vars = my_get_config_vars


# 3.step: normal setup.py

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

from distutils.extension import Extension

extensions = [Extension("foo",sources = ["foo.pyx"])]

setup(ext_modules = cythonize(extensions))

我不确定,-pthread在不使用python解释器构建并加载结果模块的情况下,这是一个好主意-pthread-不确定它不会以某些细微的方式破坏并按预期工作。



 类似资料:
  • 我在试着做POM。xml生成两个jar文件。一个包含所有类,另一个不包含其中一个类。 我试图排除的文件名为“ExcludeMe1”。爪哇。”我是新来的,但这不是我的第一次牛仔竞技,在下面的代码中,我排除了ExcludeMe1。班但是jar文件的大小保持不变,我相信它仍然包含我排除的类。这就是我的意思。。。 我期望发生的是排除大小为1KB的类文件。因此,我希望得到N和N-1,而不是两个罐子的大小都是

  • 问题内容: 当我在Windows上使用命令编译任意一个__init__.py文件时,它具有无法解析的外部符号错误(即“ LINK:错误LNK2001:无法解析的外部符号PyInit___init__”)。 当地环境: ctest / init.py setup.py 终端打印的信息: 问题答案: 也许此行为可能被视为-package中的一个小错误(如@DavidW所指出的,存在一个未解决的问题:h

  • 问题内容: 我正在使用HTML5构建拖放式Web应用程序,并将文件拖放到div上,当然要获取dataTransfer对象,这给了我FileList。 现在,我想删除一些文件,但是我不知道怎么办,或者甚至可能。 最好是我只想从FileList中删除它们;我没有用。但是,如果那不可能,我是否应该在与FileList交互的代码中编写检查代码?那看起来很麻烦。 问题答案: 如果只想删除几个选定的文件,则不

  • 问题内容: 现在,我已经在Windows 7上成功安装了Cython,我尝试使用Cython编译一些Cython代码,但是gcc使我的生活变得艰难。 使用gcc编译代码时,会抛出数十个 对 -erros的 未定义引用 ,并且我很确定src是可用的(如安装教程所述,如果缺少此文件,则会抛出 对 -errors的 未定义引用 )。 奇怪的是,使用*或-script可以很好地工作,但是当仍然在模块上工作

  • 问题内容: 在各种多线程C和C ++项目中,我已经看到该标志同时应用于编译和链接阶段,而其他人则根本不使用它,而只是转到链接阶段。 有没有编译和链接标志的危险,即实际上是做什么的?我主要对Linux平台感兴趣。 问题答案: 尝试: 并查找以。开头的任何内容。 在我的计算机上,这导致文件使用进行编译并与链接。在其他平台上,这可能有所不同。使用于大多数便携性。 在GNU libc上使用,可以更改某些l

  • 如何注释我header.php中的标语? 我正在使用2014年的主题,并试图遵循WordPress codex中的元标签说明。要生成一个描述元标记,它会指示您将描述添加到标语中。但是这个标语显示在我打开网页的每个窗口/选项卡的顶部(以及我的网站名称)。要隐藏标语,WordPress建议“删除或注释掉标头区域的标签”我做这个有困难。我在header.php?中到底要评论什么,我在标题中没有看到任何带