构建带有外部依赖的库 -- pep8

3 投票
2 回答
1458 浏览
提问于 2025-04-17 15:45

我们在工作中维护一个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的最佳实践是什么呢?

2 个回答

2

你可以使用一个需求文件,这是pip支持的功能。这个需求文件大概是这样的:

zmq
simplejson==1.2.3

然后你可以安装这些需求(假设上面的内容在requirements.txt文件里),使用:

pip install -r requirements.txt
6

请使用一个合适的 setup.py 安装脚本,这个脚本会列出你的依赖项。你可以查看 Python打包用户指南Setuptools文档 来了解更多信息。

easy_installpipzc.buildout 这样的工具也会根据需要安装你的依赖项。

撰写回答