【问题标题】:Portable python app to run on remote systems可在远程系统上运行的便携式 python 应用程序
【发布时间】:2017-11-04 19:52:57
【问题描述】:

我需要生成一个独立的可移植 python 应用程序并在远程系统上运行,即使没有安装 python 解释器或版本不同。

目的是将python脚本打包为一个应用程序,将其传输到远程系统并作为一个独立的应用程序运行,没有任何依赖关系。

我们在 Python 世界中有这样的方式吗?以前有人做过类似的事情吗?

【问题讨论】:

  • 有一个叫做py2exe的东西,你可以把你的脚本编译成可执行的exe文件。但老实说,这种解决方案并非没有问题。
  • 我们在谈论什么样的系统?用户可以使用什么,这些系统的用户将在多大程度上完成这项工作? (即你可以分发 VM 映像吗?Docker 映像呢?他们可以使用 Ansible / Puppet 之类的工具吗?)

标签: python portability


【解决方案1】:

Freezing 是游戏的名称。

这是一个使用 PyInstaller 的示例。

一个示例脚本test.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from functools import reduce


my_list = list('1234567890')

my_list = list(map(lambda x: int(x), my_list))
my_sum = reduce(lambda x, y: x + y, my_list)

print("The sum of %s is %d" % (list(my_list), my_sum))

要从脚本创建二进制文件,请安装 PyInstaller 并在您的代码上运行它:

$ pyinstaller -F test.py

完成后,您应该在./dist 中找到独立的二进制文件。当您运行它时,它的行为就像任何其他程序一样:

$ ./dist/test
The sum of [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] is 45

欲了解更多信息,请查看here

【讨论】:

  • 这应该是正确的答案。 PyInstaller 越来越受欢迎,并支持很多系统(和 Python 3)以及 GUI 包。
【解决方案2】:

由于您比 Python 已经提供的更需要可移植性,正如您提到的那样,远程系统上可能不存在 Python 解释器,因此最适合您的方法是将其编译为 Java 应用程序。您可以按照以下步骤操作。

  1. 从 jython.org(python 到 jar 编译器)安装 JDK 和 VisAD-Jython
  2. 在 VisAD-Jython 安装目录中创建一个批处理文件(或脚本)以调用 jythonc 编译器。下面是一个示例脚本。我们把它命名为 abc.bat

    @echo off
    set JYTHON_PATH=.
    set CLASSPATH=.
    %JYTHON_PATH%\jre\bin\java.exe -mx256m "-Dpython.home=%JYTHON_PATH%\\" "-Dpython .path=%JYTHON_PATH%.\\" -cp "%JYTHON_PATH%\\jython.jar;%JYTHON_PATH%\\visad.jar; %JYTHON_PATH%\\;." org.python.util.jython "%JYTHON_PATH%\Tools\jythonc\jythonc.p y " --compiler javac  %1 %2 %3 %4 %5 %6 %7 %8 %9
    
  3. 然后编译您的 .py 脚本,如下所示:

    abc --core --jar new.jar new.py
    

现在您可以使用 Java 在任何地方移植和运行它。

【讨论】:

  • 这个“最有效”的指标是什么?
  • 鉴于您需要能够在任何远程系统上运行它,您可以找到已安装的 Java 或轻松安装它,而无需担心大多数系统的平台和依赖性。编译也不需要太多工作。
  • 与 Python 相比?我不这么认为......另外,我不是最初的发布者,我只是惊讶地听到有人建议 Java 让 Python 更具跨平台性,而事实可能恰恰相反(即通过将 Python 捆绑在内部) Java 使应用程序易于分发和安装的可能性大大降低)。
  • 没注意到你不是发帖人。尽管 python 只需要一个解释器设置,但问题是它特别提到了 OP 在远程系统上不一定有一个。而另一方面,java 已经安装在更多的系统上。您所说的通常更容易接受,但在这里我认为他/她想在远程系统上运行它,他可能没有权限安装其他程序。
  • Java 也需要解释器,但 Java 解释器是用 Java 编写的,可移植性要差得多(尝试为您选择的 JDK 不支持的系统编译 JVM)。相比之下,Python 是用 C 编写的,因此,为您的平台编译 Python 可能只是开箱即用,或者可能只需要很少的补丁。大多数 Linux 系统(如果你不只专注于 PC 市场,大约 99% 的计算机)都没有安装 Java,而现在 Python 几乎是必需品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2023-01-30
  • 2011-02-09
相关资源
最近更新 更多