什么是相当于Java .jar文件的python?

Nat*_*han 34 python

Java具有将所有代码打包到称为Jar文件的文件中的概念.Python有相同的想法吗?如果是这样,它是什么?我如何打包文件?

aba*_*ert 22

Python没有任何与.jar文件完全等效的东西.

有许多不同之处,如果不知道自己想要做什么,就很难解释如何去做.但是Python包装用户指南在解释几乎所有相关内容方面做得非常好.

以下是一些主要差异.


.jar文件是一个已编译的类集合,可以放入您的应用程序中,也可以安装在您的应用程序的任何位置CLASSPATH.

在Python中:

  • 可以将.py(或.pyc)模块放入您的应用程序中,sys.path也可以将其安装在您的应用程序的任何位置,并且可以导入和使用它.
  • 一个充满模块的目录可以用同样的方式处理; 它变成了一个包(或者,如果它不包含一个包__init__.py,它将其他地方的同名目录合并sys.path到一个包中).
  • 一个.zip包含任何数量的模块和包的归档可以在任何地方进行存储,并且它的路径添加到您的sys.path(例如,在运行时或通过PYTHONPATH)及其所有内容将成为可导入.

最常见的是,您希望将事物安装到系统,用户或virtualenv site-packages目录中.建议的方法是创建一个pip兼容的包分发; 人们然后安装它(并可能通过PyPI或私人仓库自动下载)pip.

pip但是,做的远不止于此.它还允许您管理包之间的依赖关系.理想情况下,不是列出一些人必须手动下载和安装的先决条件,而是将它们作为依赖项,而有人必须这样做pip install your-library.它会跟踪您的站点包的状态,因此您可以卸载或升级包,而无需跟踪特定文件.


同时,在Java中,大多数.jar文件都是跨平台的; 建立一次,随处运行.一些软件包具有JNI本机代码,不能以这种方式使用,但它不是常态.

在Python中,许多软件包都有必须为每个平台编译的C扩展,甚至纯Python软件包通常也需要进行一些安装时配置.同时,"编译"纯Python不会做任何在运行时也无法做到的事情.所以在Python中,你通常会分发包,而不是编译包.

但是,.wheel是二进制包格式.您可以pip wheel从源包中为不同的目标构建二进制包; 然后,如果有人试图pip install你的包裹,如果他的系统有一个轮子,将下载并安装.


Ale*_*ler 6

Easy Install fromsetup_tools定义了.egg部署Python库或应用程序的格式.虽然与JAR类似,但它在Java世界中普遍存在于JAR中.很多人只是部署.py文件.

一种更新的格式,旨在取代鸡蛋,是轮子.

  • @AlexanderGessler:不推荐使用`easy_install`.请参阅[Python包装用户指南](https://python-packaging-user-guide.readthedocs.org). (3认同)

Fed*_*tta 6

尽管由于可移植性问题它不是 jar 的完美替代品,但我会添加“自动提取”存档方式。

一种可能性是“makeself”:https ://makeself.io/

但是如果您不需要打包外部文件,并且如果您喜欢 KISS 方法,那么以下是一个不错的选择:

以下内容摘自 Asim Jalis 的网站

如何将 Python 应用程序部署为 zip 文件

创建一个__main__.py包含以下内容的文件:

print "Hello world from Python"
Run Code Online (Sandbox Code Playgroud)

app.zip通过键入以下内容将 Python 文件(在本例中仅此一个文件)压缩到:

zip app.zip *
Run Code Online (Sandbox Code Playgroud)

下一步向 zip 文件添加一个shebang并将其另存为app——此时该文件app是一个包含所有 Python 源代码的 zip 文件。

echo '#!/usr/bin/env python' | cat - app.zip > app
chmod 755 app
Run Code Online (Sandbox Code Playgroud)

就是这样。该文件app现在有一个已准备好部署为单个文件的压缩 Python 应用程序。

您可以app使用 Python 解释器运行:

python app
Run Code Online (Sandbox Code Playgroud)

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

./app
Run Code Online (Sandbox Code Playgroud)

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