Python中等效于Java .jar文件的是什么?

45 投票
3 回答
50823 浏览
提问于 2025-04-18 18:14

Java有一个把所有代码打包到一个叫做Jar文件的概念。那么,Python有没有类似的东西呢?如果有,那是什么?我该怎么把文件打包呢?

3 个回答

7

虽然因为可移植性的问题,它并不是一个完美的jar替代品,但我想介绍一种“自动解压”的归档方式。

一种选择是使用“makeself”:https://makeself.io/

不过,如果你不需要打包外部文件,并且喜欢简单直接的方法,下面的方式是一个不错又干净的替代方案:

以下内容来自Asim Jalis的网站

如何将Python应用程序打包成zip文件

首先,创建一个名为__main__.py的文件,内容如下:

print "Hello world from Python"

接着,把Python文件(在这个例子中就是这个文件)压缩成app.zip,可以通过输入以下命令:

zip app.zip *

下一步是给zip文件添加一个shebang,并将其保存为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 库或应用程序。虽然这个格式和 Java 里的 JAR 文件有点像,但在 Python 世界里并没有像 JAR 那样被广泛使用。很多人只是直接发布 .py 文件。

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

35

Python没有和.jar文件完全相同的东西。

它们之间有很多不同之处,如果不知道你具体想做什么,就很难解释怎么做。不过,Python打包用户指南对相关内容的解释做得相当不错。

以下是一些主要的区别。


一个.jar文件是一个编译好的类的集合,可以放到你的应用程序里,或者安装到你的CLASSPATH的任何地方。

在Python中:

  • 一个.py(或.pyc)模块可以放到你的应用程序里,或者安装到你的sys.path的任何地方,然后可以被导入和使用。
  • 一个包含多个模块的目录也可以这样处理;它会变成一个包(或者,如果没有__init__.py文件,它会和其他同名的目录合并成一个包)。
  • 一个包含任意数量模块和包的.zip压缩文件可以存放在任何地方,并且它的路径可以添加到你的sys.path中(例如,在运行时或通过PYTHONPATH),这样它的所有内容都可以被导入。

通常情况下,你希望将东西安装到系统、用户或虚拟环境的site-packages目录中。推荐的做法是创建一个兼容pip的包分发;然后人们可以通过pip来安装它(可能还会自动从PyPI或私有仓库下载)。

不过,pip的功能远不止这些。它还可以帮助你管理包之间的依赖关系。因此,理想情况下,你不需要列出一堆别人必须手动下载和安装的前置条件,而是把它们作为依赖关系,这样别人只需要pip install your-library就可以了。而且它会跟踪你site-packages的状态,这样你就可以在不需要找到具体文件的情况下卸载或升级一个包。


与此同时,在Java中,大多数.jar文件是跨平台的;编译一次,随处运行。虽然有一些包包含JNI本地代码,不能这样使用,但这并不是常态。

在Python中,许多包有C扩展,需要为每个平台编译,甚至纯Python包通常也需要在安装时进行一些配置。而且,"编译"纯Python并不会做任何在运行时也能做到的事情。因此,在Python中,你通常分发的是源代码包,而不是编译过的包。

不过,.wheel是一种二进制包格式。你可以使用pip wheel从源包构建不同目标的二进制包;然后,如果有人尝试pip install你的包,如果他的系统有对应的wheel文件,就会下载并安装它。

撰写回答