Java的概念是将所有代码打包到一个名为Jar文件的文件中。 Python有相同的想法吗?如果是这样,它是什么?如何打包文件?
答案 0 :(得分:21)
Python与.jar
文件没有任何确切的等价物。
存在许多差异,如果不确切地知道自己想要做什么,就很难解释如何做到这一点。但是Python Packaging User Guide在解释几乎所有相关内容方面做得非常好。
以下是一些主要差异。
CLASSPATH
的任何位置。
在Python中:
.py
(或.pyc
)模块可以放入您的应用程序中,也可以安装在sys.path
的任何位置,并且可以导入和使用。__init__.py
,它会与sys.path
上其他位置的同名目录合并到一个包中。.zip
存档可以存储在任何地方,并且其路径已添加到sys.path
(例如,在运行时或通过PYTHONPATH
)及其所有内容变得可导入。最常见的是,您希望将事物安装到系统,用户或virtualenv site-packages
目录中。建议的方法是创建一个pip
兼容的软件包分发;然后人们通过pip
安装它(并可能从PyPI或私人仓库自动下载)。
pip
做的远远不止于此。它还允许您管理包之间的依赖关系。因此,理想情况下,您不必列出一些必须要手动下载和安装的先决条件,而是将它们作为依赖项,而只需要pip install your-library
。它会跟踪您的站点包的状态,因此您可以卸载或升级包,而无需追踪特定文件。
同时,在Java中,大多数.jar
文件是跨平台的;建立一次,随处运行。一些软件包具有JNI本机代码,不能以这种方式使用,但这不是常态。
在Python中,许多软件包都有必须为每个平台编译的C扩展,甚至纯Python软件包也经常需要进行一些安装时配置。同时,“编译”纯Python不会做任何在运行时无法完成的事情。因此,在Python中,您通常会分发源包,而不是编译的包。
但是,.wheel
是二进制包格式。您可以pip wheel
为源包中的不同目标构建二进制包;然后,如果有人试图pip install
你的包裹,如果他的系统有一个轮子,那么它将被下载并安装。
答案 1 :(得分:6)
Easy Install from setup_tools
定义了用于部署Python库或应用程序的.egg
格式。虽然与JAR类似,但它在Java世界中普遍存在于JAR中。许多人只是部署.py
个文件。
用于取代鸡蛋的新格式为wheel。
答案 2 :(得分:2)
尽管由于可移植性问题,它不是jar的完美替代品,但我将添加“自动提取”存档方式。
一种可能性是“ makeself”:https://makeself.io/
但是,如果您不需要打包外部文件,并且如果您喜欢KISS方法,则以下是一种不错的选择:
以下内容摘自Asim Jalis的website。
创建一个文件__main__.py
,其中包含:
print "Hello world from Python"
通过键入以下内容将Python文件(在本例中为该文件)压缩为app.zip
:
zip app.zip *
下一步,在压缩文件中添加一个 shebang 并将其另存为app
-此时,文件app
是一个包含所有Python源代码的压缩文件。
echo '#!/usr/bin/env python' | cat - app.zip > app
chmod 755 app
就是这样。文件app
现在具有一个压缩的Python应用程序,可以将其部署为单个文件。
您可以使用以下Python解释器运行app
:
python app
或者您可以直接从命令行运行它:
./app