【问题标题】:How to do in order to package python modules separately when organized in the same project?在同一个项目中组织时如何单独打包python模块?
【发布时间】:2020-05-29 08:39:46
【问题描述】:

我在 Java 和 Maven 方面更有经验,并且是 Python 的真正初学者,所以我真的不知道什么可以做,什么不可以。

在 Java 中,使用 Maven 我们可以在文件中管理依赖版本(pom parent / 聚合器模块),然后在 pom.xml 中重新声明子模块必要的依赖关系,同时省略它们由 pom 父管理的版本。这样,我们可以在物理上单独分配子模块(例如:机器中的每个模块)并且每个模块将只打包其所需的依赖项,即在其自己的 pom 文件中定义的库。

现在回到Python,目前我使用setup.py 文件,据我了解,该文件应该在根模块中。但随后它将整个模块打包为一个库。

有没有办法更好地管理模块及其依赖项,并能够将每个(选择的)模块单独部署为具有自己所需库的独立包?我希望能够选择单独打包的模块,我不希望每个包含__init__.py的文件夹都单独打包。

目前我使用 Pipenv 来管理我的依赖项,但如果它不满足我上面解释的设计,我准备放弃它。

谢谢

【问题讨论】:

    标签: java python maven packaging pipenv


    【解决方案1】:

    requirements.txt

    如你所说,在 java 中,我们有 pom.xml

    在 python 中,你有:requirements.txt,内容如下:

    # Requirements without Version Specifiers #`
    nose
    nose-cov
    beautifulsoup4
    
    # Requirements with Version Specifiers #`
    docopt == 0.6.1             # Version Matching. Must be version 0.6.1
    keyring >= 4.1.1            # Minimum version 4.1.1
    coverage != 3.5             # Version Exclusion. Anything except version 3.5
    Mopidy-Dirble ~= 1.1        # Compatible release. Same as >= 1.1, == 1.*
    

    要安装,请运行:

    pip install -r requirements.txt
    

    java/maven 中的依赖项

    有了maven,我们就有了很好的依赖管理:

    org.acme.demo.springboot:acme-api:jar:1.0.0
    +- mysql:mysql-connector-java:jar:8.0.13:compile
    +- io.jsonwebtoken-jjwt:jar:0.9.1:compile
    |  \- com.fasterxml.jackson.core:jackson-databind:jar:2.9.7:compile
    |     +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile
    |     \- com.fasterxml.jackson.core:jackson-core:jar:2.9.7:compile
    +- com.jayway.jsonpath:json-path:jar:2.4.0:compile
    |  +- net.minidev:json-smart:jar:2.3:compile
    |  |  \- net.minidev:accessors-smart:jar:1.2:compile
    |  |     \- org.ow2.asm:asm:jar:5.0.4:compile
    |  \- org.slf4j:slf4j-api:jar:1.7.25:compile
    

    例如:我的应用是 acme-api,并且在其 pom.xml 中有这些依赖项:

    • mysql:mysql-connector-java 不依赖任何东西
    • io.jsonwebtoken-jjwt 取决于 jackson-databind、jackson-annotations 和 jackson-core

    如果您查看 jackson-core 源代码,您会发现另一个 pom.xml 仅包含 jackson-core

    所需的依赖项

    因此,在 java/maven 中,任何源代码存储库必须有 pom.xml(应用程序或库),我们可以在其中找到或下载所需的库


    python 中的依赖项

    之前java/maven中任何源码中与pom.xml相关的策略,在python中都没有用到。

    我查看了几个公共图书馆,但我没有在其中找到 requirements.txt o_O

    只有应用程序使用 requirements.txt,例如 django。

    库使用 setup.py 而不是 requirements.txt 并且所需的库被硬编码在 setup.py 中:

    install_requires=["oauthlib>=3.0.0", "requests>=2.0.0"],
    extras_require={"rsa": ["oauthlib[signedtoken]>=3.0.0"]},
    

    requirements.txt 作为 pom.xml

    为了标准化,您可以在任何库或应用程序中使用 requirements.txt,修改 setup.py 以从 requirements 中读取值.txt 而不是硬编码的install_requires

    install_requires=["oauthlib>=3.0.0", "requests>=2.0.0"],
    

    有了这个,你会在任何python源代码中找到一个requirements.txt,你会有点接近我们的Java中的Maven

    【讨论】:

      【解决方案2】:

      希望this 对您有所帮助。谈论一种类似于在 java 中看到的模式。通常在 python 中,我们会有独立的包,它们相互使用,并说它们相互依赖(或者有一个伪主包和一个将它们联系在一起的 init)。

      对于 java 模式,一种简单的方法是在一个源代码控制 repo 下拥有多个包。文章详细解释了。

      【讨论】:

        【解决方案3】:

        没有什么可以完全满足您的需求(至少据我所知)。在 python 中,我们管理项目或库的依赖项的方式是使用 requirements.txt 和虚拟环境。两者都管理整个项目的依赖关系。

        要将各个模块从项目中分离出来,您可以将它们视为单独的项目并执行每个项目所需的操作。制作 requirements.txt,或者如果您需要使用 setup.py 安装它,请将它们放入其中。

        因此,对于您想要“分离”的每个“子库”,请制作不同的 requirements.txt 或 setup.py。

        有一个名为 pipreqs(可能还有其他)的库,它扫描文件夹并自动生成需求文件。我总是建议您在安装任何库后立即手工制作需求文件。

        【讨论】:

          【解决方案4】:

          如果您希望打包您的 python 代码,您可以查看poetry,尽管无法实现像 maven 这样的多项目构建。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-01-24
            • 2020-06-22
            • 1970-01-01
            • 2019-07-11
            • 2010-09-13
            • 2019-02-06
            • 1970-01-01
            • 2021-03-23
            相关资源
            最近更新 更多