【问题标题】:Python package import subpackage - good practice?Python包导入子包 - 好的做法?
【发布时间】:2013-08-16 22:02:34
【问题描述】:

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

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

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

即做这里所做的事情:Python: importing a sub‑package or sub‑module

【问题讨论】:

  • 如果你只是想避免让人 git clone 并手动构建和安装,pip install git+github.com/foo/bar 透明地包装所有这些。这是一个可接受的临时解决方案(直到他们更新 PyPI)?
  • 最后我选择了@abarnet 的解决方案——这只是一个临时修复,我所有的测试似乎都通过了。与此同时,我会尝试让 jsonpickle 人员将他们的最新版本上传到 pypi。

标签: python pip distutils jsonpickle


【解决方案1】:

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

有时,它仍然值得做。例如,非常流行的requests 模块包括its own copy 的其他包,如urllib3。是的,它确实面临上述两种成本。但这也意味着request 的每个版本都可以依赖于urllib3 的确切特定版本。由于requests 大量使用了urllib3 很少使用的接口,甚至还针对它的一些已知错误提供了解决方法,这可能很有价值。

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

pip install git+https://github.com/foo/bar

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

【讨论】:

    【解决方案2】:

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

    您没有提到“最新”的确切含义。这是 pypi 的最新版本吗?

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

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

    【讨论】:

    • 我完全同意通常最好避免这种情况,但在这种情况下,我相当卡住——我所说的最新是指 github 上的最新版本,pypi 上的版本太旧了。我已联系开发人员更新它,但同时我需要一个解决方案。
    • 实际上,使用 Python 并不少见。例如,非常流行的requests 模块包括its own copy 的其他包,如urllib3。你是对的,最好避免它,但有些情况你不能。
    • 我同意在某些情况下无法避免,但通常不会这样做。你知道为什么 requests 会这样吗?也许他们有充分的理由(就像它是一个特别修补的版本),但我不记得我从源代码构建的许多 python 包都这样做了。我认为这可以归因于 python 有一个事实上的存储库。在 C 项目中发现它的原因是,C 社区没有 pypi 等效项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2018-05-23
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多