将独立的 Python 网络应用程序分发给非技术用户

1. 问题背景

我们需要编写一个 Python 网络应用程序,供教师和学生在课堂上使用。该应用程序将在托管的网站上运行,但我们也希望用户能够下载一个自包含的应用程序,以便他们可以在本地安装,以获得更好的性能或他们根本无法在教室中使用互联网连接。

用户将无法管理诸如"首先安装 Python,然后安装依赖项,下载 .tar.gz 存档并将这些命令键入命令行..."之类的指令。我们需要能够创建一种一体机类型的安装程序,该安装程序可以安装 Python、依赖项 (Python-LDAP)、一些 Python 代码,并将基于 Python 的 Web 服务器注册为 Windows 服务。

我们已经查看了以前的问题,但似乎没有一个相关的问题。我们不担心源代码的安全性(我们的应用程序将是开源的,我们将销售与之匹配的内容),我们只需要非技术 Windows 用户能够下载并使用我们的应用程序而不会出现任何问题。

我们目前的想法是使用 NSIS 创建一个包含 Python 和 Python-LDAP 作为 MSI 的安装程序,然后注册我们自己的简单的基于 Python 的 Web 服务器作为 Windows 服务,并在启动菜单/桌面上放置一个快捷方式,链接到 http://localhost。NSIS 可以做到这一点吗?例如,NSIS 可以检查当前安装的 Python 副本吗?有没有更好的方法来做到这一点------是否有方便的框架可以让我们将代码放入一个文件夹并将其捆绑起来以制作安装程序?

2. 解决方案

方法一

使用 NSIS 是一个好主意,但我们建议使用诸如 pyinstaller(我们个人最喜欢的,其他选择是 bb_freeze 和 py2exe)这样的"打包器"来在使用 NSIS 之前创建 exe。

这样做可以获得的主要好处是:

  1. 下载量更小,因为您不会捆绑整个 Python 标准库和应用程序不需要的其他东西,而且您还可以获得一个 exe 文件来启动!
  2. 您可以使用 pyinstaller --onefile 创建一个单文件exe,这是非常方便的,因为用户只需要单击一下即可运行您的应用程序,而无需安装任何其他东西。
  3. pyinstaller 允许您指定要包含在 exe 中的依赖项,这样您就不必担心用户没有安装正确的 Python 版本或其他依赖项。

示例代码如下:

复制代码
pyinstaller --onefile --windowed my_app.py

这将创建一个名为 my_app.exe 的单文件 exe,该文件包含运行应用程序所需的所有内容。

方法二

您可以使用像 cx_Freeze 这样的工具将 Python 脚本转换为可执行文件,然后使用 NSIS 将可执行文件打包成安装程序。

cx_Freeze 可以将 Python 脚本转换为名为"my_app.exe"的可执行文件,然后可以使用 NSIS 将可执行文件打包成名为"my_app-setup.exe"的安装程序,如下所示:

1. 使用 cx_Freeze 将 Python 脚本转换为可执行文件。

复制代码
cxfreeze my_app.py --target-name my_app.exe

这将创建一个名为 my_app.exe 的可执行文件。

2. 使用 NSIS 将可执行文件打包成安装程序。

复制代码
nsis-makensis my_app.nsi

这将创建一个名为 my_app-setup.exe 的安装程序。

3. 使用安装程序安装应用程序。

复制代码
my_app-setup.exe

这将安装应用程序。

不管您选择哪种方法,您都可以创建一个独立的 Python 网络应用程序,该应用程序可以轻松分发给非技术用户。

相关推荐
xufengzhu12 小时前
Python库PyMySQL的使用指南
开发语言·python·pip
z落落20 小时前
C# 泛型方法(原理、类型推断、多泛型参数)+泛型效率(普通类型 VS Object装箱 VS 泛型)
开发语言·c#
L_090720 小时前
【C++】异常
开发语言·c++
世辰辰辰21 小时前
批量修改图片/文本名子
开发语言·python·批量修改文件名
myenjoy_11 天前
MQTT 与 Sparkplug B——从车间到云端的最后一公里
网络·python
z落落1 天前
C# 四种特殊类:抽象类、密封类、静态类、部分类
开发语言·c#
VidDown1 天前
Webhook 调试器:让第三方回调“原形毕露”
java·开发语言·javascript·编辑器·postman
装不满的克莱因瓶1 天前
基于 OpenResty 扩展开发实现动态服务注册与发现能力
java·开发语言·架构·openresty
颜酱1 天前
LangChain 输出解析器:把模型回复变成你要的数据
python·langchain
2401_873479401 天前
企业安全运营中,如何用IP离线库提前发现失陷主机?三步实现风险画像
网络·数据库·python·tcp/ip·ip