将独立的 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 网络应用程序,该应用程序可以轻松分发给非技术用户。

相关推荐
Mikhail_G17 分钟前
Python应用for循环临时变量作用域
大数据·运维·开发语言·python·数据分析
人衣aoa1 小时前
Python编程基础(二)| 列表简介
开发语言·python
Forest_HAHA1 小时前
<5>, Qt系统相关
开发语言·qt
10000hours1 小时前
【存储基础】NUMA架构
java·开发语言·架构
豆沙沙包?1 小时前
2025年- H61-Lc169--74.搜索二维矩阵(二分查找)--Java版
python·线性代数·矩阵
AntBlack1 小时前
计算机视觉 : 端午无事 ,图像处理入门案例一文速通
后端·python·计算机视觉
Freshman小白2 小时前
基于python脚本进行Maxwell自动化仿真
python·自动化
weixin_493202632 小时前
R语言错误处理方法大全
开发语言·r语言
wangyuxuan10292 小时前
AtCoder Beginner Contest 399题目翻译
开发语言·c++·算法
执笔论英雄2 小时前
【Deepseek 学网络互联】跨节点通信global 和节点内通信CLAN保序
开发语言·网络·php