Python中与Java的.jar文件相当的是什么?

45

Java有将所有代码打包成一个名为Jar文件的概念。Python有类似的想法吗?如果有,它是什么?我如何打包这些文件?


1
Python没有与.jar文件完全相等的东西。您想要做什么?您是要分发单个模块、包目录还是两者以上?您希望它被安装,还是在原地使用?您想禁止、允许或要求在目标机器上进行配置? - abarnert
1
通常,你想要做的事情是创建一个打包分发。有关详细信息,请参阅 Python 打包用户指南 - abarnert
Jython 是 Python 的一个版本,可以在 Java 虚拟机上运行...虽然这不是你所要求的,但我认为值得注意的是,如果你想的话确实可以将一堆 Jython 脚本打包成一个实际的 JAR 文件。 - Antony
3个回答

35

Python没有与.jar文件完全等价的东西。

有很多不同之处,如果不知道你想做什么,很难解释如何做。但是Python Packaging User Guide相当好地解释了所有相关内容。

以下是一些主要区别。


.jar文件是编译好的类集合,可以放入应用程序中,或安装到CLASSPATH的任何位置。

在Python中:

  • .py(或.pyc)模块可以放入您的应用程序中,或安装到sys.path的任何位置,并且可以被导入和使用。
  • 一个模块文件夹可以被视为一个包(或者,如果它不包含__init__.py文件,则会与其他同名文件夹合并到sys.path的其他位置形成单个包)。
  • 一个包含任意数量模块和包的.zip归档文件可以被存储在任何位置,并将其路径添加到您的sys.path(例如,运行时或通过PYTHONPATH),则其所有内容都可导入。

大多数情况下,您希望将东西安装到系统、用户或虚拟环境的site-packages目录中。推荐的方法是创建一个与pip兼容的软件包分发;人们可以通过pip安装它(并可能自动从PyPI或私有存储库下载)。

pip不仅如此,它还允许您管理软件包之间的依赖关系。因此,理想情况下,您只需将它们作为依赖项列出,而无需列出某人必须手动下载和安装的一堆先决条件,然后某人只需使用pip install your-library即可。它还跟踪您的站点包的状态,因此您可以卸载或升级软件包而无需追踪特定文件。


与此同时,在Java中,大多数.jar文件都是跨平台的; 只需要构建一次,随处运行。一些软件包具有JNI本地代码,无法以这种方式使用,但这并不是常态。

在Python中,许多软件包具有必须针对每个平台进行编译的C扩展程序,即使是纯Python软件包也经常需要进行一些安装时配置。与此同时,“编译”纯Python并没有做任何可以在运行时做得更好的事情。因此,在Python中,您通常分发软件包,而不是编译软件包。

但是,.wheel是一种二进制软件包格式。您可以使用pip wheel从源软件包构建针对不同目标的二进制软件包; 然后,如果有人尝试pip install您的软件包,并且他的系统有一个wheel,则会下载并安装该软件包。


7
尽管由于可移植性问题,它不是jar文件的完美替代品,但我会添加“自动提取”档案方式。
一种可能的解决方案是“makeself”:https://makeself.io/ 但如果您不需要打包外部文件,并且喜欢KISS方法,则以下是一个不错而干净的替代方案:
以下内容摘自Asim Jalis的网站
如何将Python应用程序部署为zip文件
创建一个名为__main__.py的文件,其中包含:
print "Hello world from Python"

将Python文件(在本例中只有此文件)压缩成app.zip,方法是键入:

zip app.zip *

下一步是将一个shebang添加到zip文件中并将其保存为app——此时的文件app是包含所有Python源代码的zip文件。
echo '#!/usr/bin/env python' | cat - app.zip > app
chmod 755 app

好的,完成了。现在文件app已经成为一个压缩的Python应用程序,可以作为单个文件部署。

您可以使用Python解释器运行app,方法如下:

python app

或者您可以直接从命令行运行:

./app

参考资料:https://gist.github.com/asimjalis/4237534


7

setup_tools轻松安装定义了.egg格式,用于部署Python库或应用程序。虽然类似于JAR,但在Java世界中并不像JAR那样普及。许多人只部署.py文件。

一个新的格式,旨在取代egg,是wheel


1
这是一个相当过时的答案;你不应该向人们推荐已弃用的工具。 - abarnert
3
@AlexanderGessler:“easy_install”已经不再使用了。请参考Python包装用户指南 - abarnert
1
@AlexanderGessler:如果不知道他具体想做什么,这里就没有真正的答案。无论是.egg还是.wheel,它们都不像.jar在一些最重要的方面(特别是如果你有任何本地代码和/或平台特定的配置)。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接