Python中等效于Java .jar文件的是什么?
Java有一个把所有代码打包到一个叫做Jar文件的概念。那么,Python有没有类似的东西呢?如果有,那是什么?我该怎么把文件打包呢?
3 个回答
虽然因为可移植性的问题,它并不是一个完美的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
来自 setup_tools
的简单安装 定义了 .egg
格式,用于发布 Python 库或应用程序。虽然这个格式和 Java 里的 JAR 文件有点像,但在 Python 世界里并没有像 JAR 那样被广泛使用。很多人只是直接发布 .py
文件。
一个更新的格式,旨在取代 egg 格式的是 wheel。
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文件,就会下载并安装它。