【问题标题】:Building a library with external dependencies -- pep8构建具有外部依赖关系的库——pep8
【发布时间】:2013-02-13 15:02:58
【问题描述】:

我们为工作中的各种代码保留了一个 python 库。这是共享代码、只实现一次、保持一致等的好方法。它的一部分依赖于外部库,并且对此有几个解决方案,但没有一个感觉是正确的。

一种解决方案是将整个外部库包含在我们的库中。论点是外部库的版本是可以控制的,但这增加了一堆代码,丑陋,感觉不像python。

另一个解决方案是try import,如果导入失败,则会出现打印错误。这感觉很好,是 pep8,但是我们的库有各种各样的模块,你经常需要其中的一部分,而不是另一部分。使用此解决方案,您会在不影响您的情况下看到错误。有投诉。

try:
    import zmq
    import simplejson
except:
    print "Install zmq and simplejson to use the LiveFeedSubscription()."

我建议把try imports放到__init__类中(解决了上面的问题),但是不是pep8;并且可以说更难判断依赖项是什么,因为它们没有在模块顶部导入。

def __init__(self, msg_type='', msg_types=[], debug=False):
    try:
        import zmq
        import simplejson
    except:
        print "Install zmq and simplejson to use the LiveFeedSubscription()."

将外部库包含在具有如此大差异模块的库中的 Python 最佳实践是什么?

【问题讨论】:

    标签: python


    【解决方案1】:

    请改用适当的setup.py 安装脚本,它会列出您的依赖项。请参阅Python Packaging User GuideSetuptools documentation

    easy_installpipzc.buildout 等工具也会根据需要安装您的依赖项。

    【讨论】:

    • 这并不理想,因为在许多用例中人们不需要/不想要外部库。当同事第一次需要使用简单的 gps_date_converter(),但无法获得像 matplotlib 这样的外部依赖项来在他需要的一些旧 RHEL3 机器上编译时,我会抓狂。
    • @jhau:但问题不在于依赖管理,而在于不支持这些依赖的旧目标机器。这与将依赖项捆绑在包中或让工具为您安装它们无关。
    • 这里的共识是不应该要求安装所有的dep来使用库中不相关的部分。
    • @jhau:没关系,zc.buildout 和 pip 也支持可选依赖项。您要求最佳实践,最佳实践是在标准元数据中指定可通过工具安装的依赖项。有关示例,请参见 Optional dependencies in distutils / pip
    • 我们将在开发模式下使用分布式 extras_require。这将使我们能够将所有内容保留在 repo 中,并以理智的方式逐项列出具有需要它们的功能的外部包。仍然会将导入放在需要它们的类__init__ 中。模块顶部没有导入似乎没那么糟糕,因为外部部门明确列在 setup.py 中。
    【解决方案2】:

    您可以使用a requirements filepip 支持。这看起来像:

    zmq
    simplejson==1.2.3
    

    然后您将安装要求(假设上面在requirements.txt 中使用:

    pip install -r requirements.txt
    

    【讨论】:

    • 我喜欢这个。列出了所有外部库和版本,可以根据用户要求安装。
    猜你喜欢
    • 2023-03-18
    • 2017-04-23
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2012-11-08
    相关资源
    最近更新 更多