将脚本转换为可执行文件并包含远程文件夹中的数据文件

4 投票
2 回答
557 浏览
提问于 2025-04-18 12:50

我有一个小应用程序,是为了帮助我办公室的其他同事而做的。我是个IT人员,但我们行业并不太技术化,所以我想尽量简单,同时又能在不完全重新打包的情况下修改程序。我的程序大致是这样的:

| C:\Program Files (x86)\company_name\product_name
| | findppw.exe (my script)
| | runtime files that are built during the freeze
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
| %APPDATA%\company_name\product_name\
| | Reports\
| | | This gets filled with temp files only
| | Logs\
| | | This gets filled with log files
| | config.ini
| | stores.ini

我在准备%APPDATA%文件夹时遇到了一些麻烦,这也是我提问的重点。

我的findppw.pyw脚本有以下导入:

from tkinter import *
from tkinter import ttk
import threading
from collections import OrderedDict
import datetime
import zipfile
from tempfile import NamedTemporaryFile
import queue
import os,sys # for sys.exit and os.startfile
import logging
from appdirs import AppDirs # to find %appdata% equivalent
import ast # for literal_eval of info in stores.ini and config.ini

我尝试过使用cx_Freezepy2exe来打包这个程序。

关于py2exe:

py2exe可以正确编译程序,无论有没有设置脚本,但无论哪种情况,生成的可执行文件在启动时都会出现Windows错误:“查找文档已停止工作”,没有更多的信息。虽然我可以提供崩溃时生成的日志文件,但对我排查问题没有帮助。

关于cx_Freeze:

当py2exe让我失望后,我开始寻找替代方案,找到了cx_Freeze。它承诺可以使用安装程序(“太好了,”我想,“这应该能帮我处理%APPDATA%设置!”),但我对如何设置setup.py来实现这一点有点迷茫,甚至不知道这是否可能!我的另一个选择是在我的脚本中创建一个initialize函数,检查这些文件夹/文件是否存在,如果不存在就创建它们,并设置为一些初始的硬编码值。不过,这感觉更像是安装程序的工作,而不是可执行文件的工作。

不过,最终可执行文件是能正常工作的,这也是个好消息……

我的问题:

我该如何为cx_Freeze编写一个setup.py脚本?编辑:有个很棒的评论建议使用pyinstaller,所以我想补充说,任何能把数据文件放到正确位置的库,同时让我有一个可以用来分发程序到其他办公室系统的Windows安装程序,都可以!

附带问题,但可能超出这个问题的范围:为什么py2exe的方法失败了?

2 个回答

0

我不太确定我是否理解你的问题,不过你可以用py2exe或者pyinstaller来生成一个可执行文件。接着,你需要手动找出缺失的库文件,然后使用Inno Setup来创建一个安装程序。也许记录一下日志会有帮助。

1

我不同意这个工作应该由安装程序来做。如果你在每次启动程序时都检查一下(如何检查一个目录是否存在并在必要时创建它?),那么即使应用数据文件夹消失了,你的程序也不会崩溃。

如果你在安装后需要写入ini文件,它们应该放在应用数据文件夹里。在这种情况下,程序文件夹里的副本可以当作模板,根据需要进行复制。

关于cx_freeze:使用命令 python setup.py bdist_msi 来制作msi文件。你可以在https://bitbucket.org/anthony_tuininga/cx_freeze/src/bd72fda4b395257c3d8e170213c039f2da40dd2f/cx_Freeze/samples/?at=default找到一些安装文件的示例,cx_freeze的安装包里也有。文档可以在http://cx-freeze.readthedocs.org/en/latest/index.html查看。

撰写回答