能否将Python及其必要的库导出为一个独立环境文件?

6

我有一个使用keras和tensorflow库的Python脚本,每次在不同机器上设置这些库都非常耗时。是否可以将我的Python脚本和keras和tensorflow库导出到像Java项目中的.jar文件那样的文件中,以便于我不需要每次移动到新机器时重新设置库?


.jar 是普通的 .zip 文件。 - furas
@furas,我想你是在说“.tar”吧? - Bing Gan
@furas 啊,我的意思是我可以像 java -jar project.jar 一样执行 python -something project.xxx - Bing Gan
类似的工具有py2exe、pyinstaller和cx_freeze。它们将所有文件打包在自执行的.zip文件中。但是它们也会放置.dll.so文件,因此在Windows上创建的文件只能在Windows上运行(Linux同理)。 - furas
1
最简单的方法是设置一个虚拟环境并打包它。问题在于,Python不像Java那样在虚拟机中运行其代码。因此,如果您有不同的平台,它们将需要不同版本的TensorFlow构建,因此您打包的一个虚拟环境将无法工作。但是,如果您要在具有相同操作系统的多台计算机之间移动,则可以使用此方法。 - Mad Wombat
显示剩余2条评论
3个回答

6
Python 3 包含一个名为 zipapp 的工具,允许您将 Python 项目构建为单个归档文件,并捆绑所有(或一些)依赖项。 该工具仅与 Python 3 捆绑在一起,但生成的归档文件将适用于任何您所针对的 Python 版本 >= 2.6。 假设您的所有源文件都在 src/ 中,包括上述 Tensor Flow 库:
$ python3 -m zipapp -o yourapp.pyz -m "your.entry.point.module:main_function" src/

-m 标志允许您指定一个模块和其中的一个函数,用 : 分隔,当您运行 .pyz 文件时将执行它。关于运行它,只需要:

$ python ./yourapp.pyz

如果您想使用此功能,需要安装 Python >= 2.6。

如果您的目标平台是Unix系统,您可能还需要添加一个shebang:

$ echo "#! /usr/bin/python" > yourapp2.pyz
$ cat yourapp.pyz >> yourapp2.pyz
$ chmod +x yourapp2.pyz

这样您可以运行该文件:

$ ./yourapp2.pyz

作为一个附注,.pyz 实际上就是一个 .zip 文件。你可以自己创建一个没有使用 zipapp.pyz 文件,只需在顶层包含一个 __main__.py 文件,这将成为你的捆绑入口点。

4
这与Python应用程序的部署有关,对于复杂的项目来说并不是一件容易的事情。但如果唯一的问题是处理库的安装,则常见的解决方案是:

在项目中包含一个文本文件(通常为requirements.txt),其中包括您所需的库和版本

你可以使用

pip freeze > requirements.txt

但你应该删除过去安装但实际未使用的库。

在目标机器上运行:

pip install -r requirements.txt

建议使用虚拟环境来设置环境,但是将一个机器上的虚拟环境复制到另一个机器并直接使用并不安全或可扩展(仅适用于相同的操作系统、相同的Python版本和相同的目录结构)。


1
谢谢您!在不同计算机上设置环境时非常方便。 - Lucas P.

2

不是文件,而是文件夹。使用virtualenv (https://virtualenv.pypa.io/en/stable/)。您可以指定Python版本,并将其安装在文件夹中:

virtualenv -p /usr/bin/python2.6 <path/to/new/virtualenv/>

您可以使用pip在特定环境下安装软件包和模块,然后将该文件夹压缩并移动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接