【问题标题】:Python-module: #ifdef for setup.py [duplicate]Python模块:setup.py的#ifdef [重复]
【发布时间】:2013-12-05 13:57:17
【问题描述】:

我正在构建一个 python 模块,但不知何故被卡住了。 我想让一些功能可选,即如果禁用它们就根本不存在(甚至不是方法)。

我的模块由 C 和 Python 部分组成;我在 Python 中搜索类似于 #ifdefs 的内容,因为如果禁用了 C 中的一项功能,则不应安装与 Python 相关的东西。

有什么建议吗?

【问题讨论】:

  • 好的,但是我如何告诉“setup.py build”只能构建C部分的某个部分?

标签: python python-module conditional-compilation setup.py


【解决方案1】:

没有这样的东西,至少,不像它在 C 中那样工作。

相反,我建议您这样做:

  • 如果某个部件是可选的,因为它需要安装更多的第 3 方库,请在 setup.py 中定义一些 extras See here

  • 如果您想支持“可插入”功能(例如,某种插件,...),请使用 setuptools 的 entry points 并将功能拆分到多个包中。然后,只安装你需要的包。

【讨论】:

    【解决方案2】:

    这与任何其他类型的 if 语句没有什么不同。问题是,函数定义(不仅仅是声明)实际上就像任何其他代码一样,所以你可以做这样的事情(复制到单独的文件并作为模块导入):

    X = 1
    
    class A(object):
        def __init__(self):
            pass
    
        def funcA(self):
            return 'A'
    
        if X == 0:
            def funcB(self):
                return 'B'
    
     # then at console, if above is called 'modtest.py'...
     import modtest
     a = modtest.A()
     a.<tab>
     a.funcA
    
     # Now change the above to say X = 0, and
     reload(modtest)
     a2 = modtest.A()
     a2.<tab>
     a2.funcA a2.funcB
    

    if X == 0实际上决定了python是否会运行定义函数的代码。请注意,这是在模块导入时完成的 - 您不能“即时”更改 X 并获得一些带有 funcB 的 A 类,而另一些则没有;它只检查 X 一次,在定义类时,从那时起只传回它已经解析的类 A。

    【讨论】:

      猜你喜欢
      • 2018-02-08
      • 2015-08-09
      • 1970-01-01
      • 2011-11-06
      • 2019-09-24
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多