Python模块:#ifdef用于setup.py

时间:2013-12-05 13:57:18

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

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

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

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

至少没有这样的东西,因为它在C中不起作用。

相反,我建议你做这样的事情:

  • 如果某个部件是可选的,因为它需要安装更多第三方库,请在setup.py See here

    中定义一些extras
  • 如果您想支持“可插拔”功能(例如某种插件,......),请使用setuptools'entry points并在多个软件包中拆分功能。然后,只安装所需的软件包。

答案 1 :(得分:0)

它与任何其他类型的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.