组织在同一个项目中时,如何将python个模块分开打包?
How to do in order to package python modules separately when organized in the same project?
我在 Java 和 Maven 方面更有经验,在 Python 方面是一个真正的初学者,所以我真的不知道什么可以做什么,什么不可以。
在 Java 中,使用 Maven 我们可以在文件中管理依赖项版本(pom parent / 聚合器模块),然后在子模块的 pom.xml
中重新声明必要的依赖项,同时省略由 pom 父级管理的版本。这样,我们可以 物理上单独分发子模块 (例如:机器中的每个模块)并且每个模块只会打包其所需的依赖项,即在其自己的 pom 中定义的库文件。
现在回到 Python,目前我使用 setup.py
文件,根据我的理解,它应该在根模块中。但随后它将整个模块打包为一个库。
有没有办法更好地管理模块及其依赖关系,并能够将每个(选择的)模块作为一个独立的包单独部署,并带有自己需要的库?我希望能够选择要单独打包的模块,我不希望每个包含 __init__.py
的文件夹都单独打包。
目前我使用 Pipenv 来管理我的依赖项,但如果它不满足我上面解释的设计,我准备放弃它。
谢谢
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[=] 所需的依赖项77=]
因此,在 java/maven 中,任何源代码存储库 必须具有 pom.xml(应用程序或库),我们可以在其中找到或下载所需的库
python
中的依赖项
java/maven 中与 pom.xml 相关的任何源代码中的先前策略未在 python 中使用。
我查看了几个 public 库,但没有在其中找到 requirements.txt o_O
- https://github.com/jupyter/jupyter_client
- https://github.com/requests/requests-oauthlib(这有一个 requirements.txt 但未使用)
只是应用程序使用 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并且你会在[=127中接近我们的Maven =]
希望this对您有所帮助。谈论一种类似于 java 中看到的模式。通常在 python 中,我们会有单独的包,它们相互使用,并说它们相互依赖(或者有一个带有 init 的伪主包,将它们联系在一起)。
对于 java 模式,一种简单的方法是在一个源代码控制回购下拥有多个包。文章解释得很详细。
如果你想打包你的 python 代码,你可以看看 poetry,虽然像 maven 这样的多项目构建是无法实现的。
没有任何东西可以完全满足您的需求(至少据我所知)。在 python 中,我们管理项目或库的依赖关系的方式是使用 requirements.txt 和虚拟环境。两者都管理整个项目的依赖关系。
要将各个模块从项目中分离出来,您可以将它们视为单独的项目,并执行每个项目需要的操作。制作 requirements.txt 或者如果您需要使用 setup.py 安装它,请将它们放入其中。
因此,对于每个 'sub-library',您都想 'separate' 制作一个不同的 requirements.txt 或 setup.py。
有一个名为 pipreqs(可能还有其他)的库,它可以扫描文件夹并自动生成需求文件。我总是建议您在安装任何库后立即手工制作需求文件。
我在 Java 和 Maven 方面更有经验,在 Python 方面是一个真正的初学者,所以我真的不知道什么可以做什么,什么不可以。
在 Java 中,使用 Maven 我们可以在文件中管理依赖项版本(pom parent / 聚合器模块),然后在子模块的 pom.xml
中重新声明必要的依赖项,同时省略由 pom 父级管理的版本。这样,我们可以 物理上单独分发子模块 (例如:机器中的每个模块)并且每个模块只会打包其所需的依赖项,即在其自己的 pom 中定义的库文件。
现在回到 Python,目前我使用 setup.py
文件,根据我的理解,它应该在根模块中。但随后它将整个模块打包为一个库。
有没有办法更好地管理模块及其依赖关系,并能够将每个(选择的)模块作为一个独立的包单独部署,并带有自己需要的库?我希望能够选择要单独打包的模块,我不希望每个包含 __init__.py
的文件夹都单独打包。
目前我使用 Pipenv 来管理我的依赖项,但如果它不满足我上面解释的设计,我准备放弃它。
谢谢
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[=] 所需的依赖项77=]
因此,在 java/maven 中,任何源代码存储库 必须具有 pom.xml(应用程序或库),我们可以在其中找到或下载所需的库
python
中的依赖项java/maven 中与 pom.xml 相关的任何源代码中的先前策略未在 python 中使用。
我查看了几个 public 库,但没有在其中找到 requirements.txt o_O
- https://github.com/jupyter/jupyter_client
- https://github.com/requests/requests-oauthlib(这有一个 requirements.txt 但未使用)
只是应用程序使用 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并且你会在[=127中接近我们的Maven =]
希望this对您有所帮助。谈论一种类似于 java 中看到的模式。通常在 python 中,我们会有单独的包,它们相互使用,并说它们相互依赖(或者有一个带有 init 的伪主包,将它们联系在一起)。
对于 java 模式,一种简单的方法是在一个源代码控制回购下拥有多个包。文章解释得很详细。
如果你想打包你的 python 代码,你可以看看 poetry,虽然像 maven 这样的多项目构建是无法实现的。
没有任何东西可以完全满足您的需求(至少据我所知)。在 python 中,我们管理项目或库的依赖关系的方式是使用 requirements.txt 和虚拟环境。两者都管理整个项目的依赖关系。
要将各个模块从项目中分离出来,您可以将它们视为单独的项目,并执行每个项目需要的操作。制作 requirements.txt 或者如果您需要使用 setup.py 安装它,请将它们放入其中。
因此,对于每个 'sub-library',您都想 'separate' 制作一个不同的 requirements.txt 或 setup.py。
有一个名为 pipreqs(可能还有其他)的库,它可以扫描文件夹并自动生成需求文件。我总是建议您在安装任何库后立即手工制作需求文件。