Java有将所有代码打包成一个名为Jar文件的概念。Python有类似的想法吗?如果有,它是什么?我如何打包这些文件?
Java有将所有代码打包成一个名为Jar文件的概念。Python有类似的想法吗?如果有,它是什么?我如何打包这些文件?
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,则会下载并安装该软件包。
__main__.py
的文件,其中包含:print "Hello world from Python"
将Python文件(在本例中只有此文件)压缩成app.zip
,方法是键入:
zip app.zip *
echo '#!/usr/bin/env python' | cat - app.zip > app
chmod 755 app
好的,完成了。现在文件app
已经成为一个压缩的Python应用程序,可以作为单个文件部署。
您可以使用Python解释器运行app
,方法如下:
python app
或者您可以直接从命令行运行:
./app
从setup_tools
轻松安装定义了.egg
格式,用于部署Python库或应用程序。虽然类似于JAR,但在Java世界中并不像JAR那样普及。许多人只部署.py
文件。
一个新的格式,旨在取代egg,是wheel。
.egg
还是.wheel
,它们都不像.jar
在一些最重要的方面(特别是如果你有任何本地代码和/或平台特定的配置)。 - abarnert