在同一个项目中组织时,如何单独打包python模块?

2024-06-01 22:04:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Java和Maven方面比较有经验,而且是Python的真正初学者,所以我对什么可以做和什么不可以做都不太清楚

在Java中,使用Maven我们可以管理文件(聚合器模块的pom父模块)中的依赖项版本,然后在pom.xml子模块中重新声明必要的依赖项,同时忽略pom父模块管理的版本。通过这种方式,我们可以在物理上分别分发子模块(例如:机器中的每个模块),每个模块只打包其所需的依赖项,即在其自己的pom文件中定义的库

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

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

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

多谢各位


Tags: 模块文件py版本机器声明方式物理
3条回答

希望this会有所帮助。讨论了一种类似于java的模式。通常在python中,我们会有单独的包,这些包相互使用,并表示它们相互依赖(或者有一个伪主包,其中包含一个将其连接在一起的init)

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

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

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

因此,对于要“分离”的每个“子库”,请使用不同的requirements.txt或setup.py

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

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连接器java不依赖任何东西
  • io.jsonwebtoken jjwt取决于jackson数据绑定、jackson注释和jackson核心

如果您查看jackson core源代码,您将发现另一个pom.xml,其中只包含jackson core所需的依赖项

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


python中的依赖关系

java/maven中与任何源代码中的pom.xml相关的前面的策略在python中都没有使用

我查看了几家公共图书馆,但没有发现其中的requirements.txt

只是应用程序使用像django一样的requirements.txt

库使用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.pyrequirements.txt读取值,而不是硬编码的install\u requires

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

有了它,您将在任何python源代码中找到requirements.txt,您将稍微接近Java中的Maven

相关问题 更多 >