如何将Python打包成可执行文件(.exe),同时保持.py源代码可编辑?

8

我正在创建一个python脚本,它应该可以自我修改并且是可移植的。

我可以分别实现这两个目标,但不能同时实现。

我使用cx_freeze或pyinstaller将我的.py打包成exe,因此它是可移植的;但然后我就有了很多.pyc编译文件,因此无法从软件本身编辑我的.py文件。

有没有一种方法可以保持脚本的可移植性和轻量级(因此70mb的便携式Python环境不是选项),但仍然可以进行编辑?

想法是拥有一种类似python.exe但所有库都已链接的exe“解释器”,如pyinstaller所允许的那样,运行.py文件,以便.py脚本可以自己进行编辑或由其他脚本进行编辑,并仍然可以使用解释器执行。


你是否期望用户已经有可用的Python环境?如果是这样,你可以简单地将你的.py文件与一个bash脚本(甚至是可执行文件)一起打包,该脚本将简单地启动Python来运行你的脚本。 - Big Bro
@BigBro 不,我希望我的用户只需双击运行即可(可以有一个.bat文件来运行“hypotetical_python.exe my_script.exe”),无需任何下载或先前的安装。就像pyinstaller一样,但保留可编辑的.py文件以进行进一步的自动编辑/修补。 - Wyatt Gillette
你可以尝试排除“patch”文件,并使用数据选项进行捆绑。在你的脚本中,你从给定的数据位置加载内容。要打补丁,你需要更新数据目录的内容。 - Dschoni
数据不是用于包含资源文件、dll 或其他类似的东西吗?我的意思是,可以在数据文件夹中包含一个 .py 文件,并让可执行文件运行它吗? - Wyatt Gillette
1
刚测试了一下,可以运行。我会把一个例子作为答案发布。 - Dschoni
1个回答

3

首先定义您的主要脚本(无法更改)main_script.py。在一个子文件夹中(例如命名为data),创建 patch_script.py

main_script.py

import sys
sys.path.append('./data')
import patch_script

在子文件夹中:

data\patch_script.py

print('这是原始文件')

在根目录下创建一个spec文件,例如通过运行pyinstaller main_script.py。 在spec文件内,将补丁脚本添加为数据资源:

     ...
     datas=[('./data/patch_script.py', 'data' ) ],
     ...

运行 pyinstaller main_script.spec。执行 exe 文件,应该会打印出:

这是原始文件

编辑 patch 脚本以例如下内容:

print('这是修补后的文件')

重新执行 exe 文件,应该输出:

这是修补后的文件

注意:由于这只是一个 PoC,它可以工作但容易受到安全问题的影响,因为数据目录中的Python文件可能被用于注入任意代码(您无法控制)。您可能要考虑使用像PIP等适当的软件包和更新脚本。


非常酷,这正是我在寻找的!当然,这可能会导致安全上的潜在灾难,但现在我“不关心”这个问题,因为这将成为一个更大项目的一部分,包括加密和其他保护代码的措施 :) 非常感谢您的帮助!标记为答案! - Wyatt Gillette
你已经被警告了 ;) - Dschoni
1
你可能想要查看如何正确地执行此操作:https://pypi.org/project/PyUpdater/ - Dschoni
谢谢提供链接,那里的问题似乎是代码无法自我修改。目前不是很大的问题,但我想保持这种可能性。顺便说一下,我会阅读文档,也许我漏掉了什么。 - Wyatt Gillette
@WyattGillette 这取决于你的意思。你想让用户电脑上的本地应用程序自行编辑吗?如果是这样,那么 PyUpdater 并不适用于此...但这听起来像是一个坏主意,最好使用 JSON 或 YAML 等设置文件来处理这样的事情。如果你想要发送更新以更改/替换用户应用程序的功能,那么是的,这正是 PyUpdater 的用途。 - CrazyChucky

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