Python包导入子包 - 好的做法?

时间:2013-08-16 22:02:35

标签: python pip distutils jsonpickle

我的软件包依赖于最新版本的jsonpickle软件包。旧版本可以通过pip安装,但是我需要最新版本(即在Github上)才能工作。在这种情况下,通常认为在我的代码中捆绑最新版本的jsonpickle是正常的吗?还有其他解决方案吗?我宁愿不要求我的用户不要从github克隆。

我正在考虑像这样组织我的包:

My package
    |
__init__.py
 file1.py
 file2.py
          \
        jsonpickle (latest)

即在此处完成的工作:Python: importing a sub‑package or sub‑module

2 个答案:

答案 0 :(得分:3)

正如卡格所说,这通常不是一个好主意。并不是因为对其他软件包不友好而“不赞成”,而是它会给您和您的用户带来维护负担。 (想象一下,在jsonpickle中修复了一个影响用户的错误,但是你还没有完成修复。如果你做得正常,他们所要做的就是升级{{1但是,如果您使用的是内部副本,他们必须下载jsonpickle来源和您的来源,破解您的软件包,然后手动安装。)

有时,它仍然值得做。例如,非常受欢迎的requests模块包含its own copyurllib3其他软件包。是的,它确实面临上述两种成本。但这也意味着jsonpickle的每个版本都可以依赖request的确切特定版本。由于urllib3大量使用requests很少使用的接口,甚至为某些已知错误提供了解决方法,因此这很有价值。

在你的情况下,这听起来不像是问题。您只需暂时需要urllib3的最新版本,直到上游维护者将新版本上传到PyPI。问题不在于您不希望您的用户都拥有不同的版本;这是你不想强迫他们克隆回购并弄清楚如何手动安装它。幸运的是,jsonpickle通过将大部分困难包含在一行来解决这个问题:

pip

这不是一个漂亮的解决方案,但它只是暂时的,对吗?

答案 1 :(得分:2)

通常最好的想法是将一些依赖项与您的项目捆绑在一起。有些项目无论如何都会这样做,或者如果没有可用的系统包,则将其捆绑为替代方案。 (这主要在C项目中找到,而不是Python。)

你没有提到“最新”的含义。这是最新的pypi吗?

确保安装软件包的特定版本或大于基准版本的最佳方法是在setup.py requires部分中正确指定要求。在这里阅读更多关于需求的信息[1]。这种方式pip可以解决依赖关系,如果它在pypi中可用,它将是自动的。

[1] http://docs.python.org/2/distutils/setupscript.html#relationships-between-distributions-and-packages