2013-02-13 144 views
2

我们为工作中的各种代码保留了一个python库。它是分享代码,实现一次事物,保持一致等的一种很好的方式。它的一部分取决于外部库,并且有一些解决方案,没有一个是正确的。构建具有外部依赖关系的库 - pep8

一个解决方案是将整个外部库包含在我们的库中。争论的是外部库的版本可以被控制,但是这增加了一堆代码,很难看,并且不会觉得pythonic。

另一种解决方案是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的最佳做法是将外部库包含在具有如此大不相同的模块的库中?

回答

5

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

诸如easy_install,pipzc.buildout等工具也将根据需要安装您的依赖项。

+0

,因为有很多的使用情况下,人们并不需要这不是理想的/想要外部库 我会在第一时间想到一个同事需要使用简单的gps_date_converter(),但不能像matplotlib这样的外部依赖在一些需要它的旧RHEL3机器上编译 – jhau 2013-02-13 16:10:39

+0

@ jhau:但那里的问题不是依赖人的问题但更旧的目标机器不支持这些依赖关系。这与将你的依赖关系捆绑在你的包中或者让工具为你安装它无关。 – 2013-02-13 16:12:41

+0

这里的一致意见是,它不应该是安装所有代码以使用库的不相关部分的要求。 – jhau 2013-02-13 16:28:57

2

您可以使用a requirements file,其中pip支持。这看起来是这样的:

zmq 
simplejson==1.2.3 

然后,您可以安装要求(假设以上是requirements.txt使用:

pip install -r requirements.txt 
+0

我喜欢这个。列出了所有外部库和版本,并且可以根据用户的要求进行安装。 – jhau 2013-02-13 16:24:33