更多相关内容可查看
PyInstaller 介绍
PyInstaller 是一个用于将 Python 程序打包成独立可执行文件(executable)的工具。它能够将 Python 脚本和依赖的库、资源文件等打包成一个单独的可执行文件,适用于 Windows、macOS 和 Linux 等操作系统。
主要特点和优势:
-
跨平台支持: PyInstaller 支持在多个操作系统上打包和生成可执行文件,包括 Windows、macOS 和各种 Linux 发行版。
-
单文件打包: 它可以将一个 Python 脚本及其所有依赖的库和资源文件打包成一个独立的可执行文件,用户不需要安装 Python 解释器或额外的依赖就可以运行程序。
-
自动化打包: PyInstaller 能够自动分析 Python 程序的依赖关系,并将所有需要的文件打包进最终的可执行文件中,这包括 Python 标准库、第三方库和其他资源文件。
-
支持多种打包选项: 可以生成单个的可执行文件(Windows 上为
.exe
,macOS 上为.app
,Linux 上为可执行文件),也可以生成文件夹分发,甚至是支持 Windows 下的服务程序和控制台程序。 -
丰富的配置选项: PyInstaller 提供了丰富的配置选项,可以帮助开发者控制打包过程中的细节,比如输出文件的名字、图标文件的设置、打包过程中的路径搜索等。
-
社区活跃: PyInstaller 是一个开源项目,拥有活跃的社区支持和更新,能够及时响应和修复问题,保持与 Python 最新版本的兼容性。
PyInstaller 是一个功能强大且广泛使用的工具,可以帮助 Python 开发者将他们的程序轻松打包成独立的可执行文件,便于分发和部署。无论是用于发布桌面应用程序、命令行工具还是其他需要独立运行环境的场景,PyInstaller 都是一个非常有价值的工具选择。
PyInstaller 下载使用
·将 Python 项目打包成可接受参数的可执行文件(.exe
)通常可以通过以下步骤完成,使用工具如 PyInstaller 或 cx_Freeze。这里以 PyInstaller 为例,它是一个常用的打包工具,支持将 Python 项目打包成独立的可执行文件。
使用 PyInstaller 打包项目
-
安装 PyInstaller
如果还没有安装 PyInstaller,可以使用 pip 进行安装:
pip install pyinstaller
-
创建打包脚本
创建一个打包脚本(如
call.py
),用来指定打包的配置和参数。这是可选的,但可以帮助你在打包时指定一些特定的配置选项。(80%源码,剩余20%可私信作者)
#特殊脚本可私信作者
def is_eleven_digit_number(element):
return element.isdigit() and len(element) == 11
def is_time_format(element):
pattern = r'^\d{2}:\d{2}$'
return bool(re.match(pattern, element))
def execute_tasks(phon_num):
threads = [
threading.Thread(target=send_paipai, args=(phon_num,)),
threading.Thread(target=func3, args=(phon_num,)),
threading.Thread(target=send_chuanhang, args=(phon_num,)),
threading.Thread(target=send_wushang, args=(phon_num,)),
threading.Thread(target=send_caiyun, args=(phon_num,)),
threading.Thread(target=send_phpzw, args=(phon_num,)),
threading.Thread(target=func9, args=(phon_num,)),
threading.Thread(target=func1, args=(phon_num,)),
threading.Thread(target=func21, args=(phon_num,)),
threading.Thread(target=send_spump, args=(phon_num,)),
threading.Thread(target=func24, args=(phon_num,)),
threading.Thread(target=func19, args=(phon_num,)),
threading.Thread(target=func10, args=(phon_num,))
]
for t in threads:
t.start()
for t in threads:
t.join()
def register_hourly_tasks(phon_num,start_time,end_time,printtime,interval):
while True:
current_time = datetime.datetime.now().strftime("%H:%M")
if start_time <= current_time <= end_time:
# 如果当前时间在定时任务时间范围内,注册任务
while current_time <= end_time:
schedule.every().day.at(current_time).do(lambda:execute_tasks(phon_num))
print(f"已注册定时任务执行时间:{current_time}")
current_time = (datetime.datetime.strptime(current_time, "%H:%M") + datetime.timedelta(
minutes=interval)).strftime("%H:%M")
else:
break
else:
# 如果当前时间不在定时任务时间范围内,计算距离下一个任务开始的时间
if current_time < start_time:
next_time = start_time
else:
next_time = (datetime.datetime.strptime(current_time, "%H:%M") + datetime.timedelta(
minutes=interval)).strftime("%H:%M")
next_start = datetime.datetime.strptime(next_time, "%H:%M")
current_datetime = datetime.datetime.now()
delta = next_start - current_datetime
hours = delta.seconds // 3600
minutes = (delta.seconds // 60) % 60
seconds = delta.seconds % 60
print(f"当前时间为 {current_datetime.strftime('%H:%M')}, 距离定时任务开始还剩 {hours} 小时 {minutes} 分钟 {seconds} 秒")
time.sleep(printtime)
def shutdown_computer():
subprocess.run(["shutdown", "/s", "/t", "1"])
def is_boolean(var):
return isinstance(var, bool)
def checkdata(phon_num,start_time,end_time,shutdown_flag):
if not is_eleven_digit_number(phon_num):
print(f'{phon_num} :不是一个正确的手机号码,请修改!')
sys.exit(1)
if not is_time_format(start_time):
print(f'{start_time} :不符合时间格式 "HH:MM",请修改!')
sys.exit(1)
if not is_time_format(end_time):
print(f'{end_time} :不符合时间格式 "HH:MM",请修改!')
sys.exit(1)
if not is_boolean(shutdown_flag):
print(f'{shutdown_flag} :不符合布尔类型True/False,请修改!')
sys.exit(1)
def start():
phon_num = input("请输入手机号:")
start_time = input("请输入定时任务开始时间(例如20:00):")
end_time = input("请输入定时任务结束时间(例如21:00):")
interval = int(input("请输入定时任务间隔时间(分钟):"))
printtime = int(input("请输入控制台打印间隔时间(秒):"))
shutdown_flag = bool(input("执行完是否自动关机(例如:True):"))
#数据校验
checkdata(phon_num,start_time,end_time,shutdown_flag)
#定时任务注册
register_hourly_tasks(phon_num,start_time,end_time,printtime,interval)
#定时任务执行
while datetime.datetime.now().strftime("%H:%M") <= end_time:
schedule.run_pending()
time.sleep(30)
#清空定时任务
schedule.clear()
#关机
if shutdown_flag:
shutdown_computer()
print("已发送完成")
if __name__ == "__main__":
start()
控制台打印如下
-
使用 PyInstaller 打包
在命令行中使用 PyInstaller 将 Python 项目打包成可执行文件。假设你的 Python 脚本接受命令行参数,例如
call.py
:
pyinstaller --onefile --console call.py
--onefile
:生成单个独立的可执行文件,而不是生成多个文件。--console
:指定生成的可执行文件为控制台应用程序,这样可以在命令行中传递参数。
-
运行生成的可执行文件
完成打包后,PyInstaller 将在
dist
文件夹中生成一个可执行文件。你可以在命令行中运行这个可执行文件,并传递参数(也可以使用input输入):./dist/call.exe arg1 arg2
这里的
arg1
和arg2
是你希望传递给call.py
的命令行参数。
成功示例:
注意事项
- 参数传递方式:Python 脚本中接收命令行参数通常通过
sys.argv
,确保在打包时设置了正确的命令行参数。 - 操作系统兼容性:PyInstaller 支持在 Windows、macOS 和 Linux 上生成对应平台的可执行文件,确保在相应的操作系统上测试和使用。
- 依赖管理:确保在打包前,所有项目的依赖都已经安装,并且能够正确导入和使用。
偶尔可能会闪退,目前暂未解决,多打开几次既可以了
通过以上步骤,你可以将你的 Python 项目成功打包成可以接受命令行参数的独立可执行文件。
常用参数详解
-
-F, --onefile
: 将生成的可执行文件打包成一个单独的.exe
文件。这对于分发单个文件的应用程序很有用。pyinstaller -F yourscript.py
-
-D, --onedir
: 默认模式,将生成多个文件,包括一个目录,其中包含所有的依赖项。pyinstaller -D yourscript.py
-
-w, --noconsole
: 隐藏控制台窗口(仅限 Windows 平台)。适用于 GUI 应用程序。pyinstaller -w yourscript.py
-
--name
: 指定生成的可执行文件的名称。pyinstaller --name=myapp yourscript.py
-
-p, --paths
: 指定额外的模块搜索路径。pyinstaller -p /path/to/extra/module yourscript.py
-
--hidden-import
: 显式导入隐藏的依赖项,以确保 PyInstaller 能够找到并打包这些依赖项。pyinstaller --hidden-import=module_name yourscript.py
-
--icon
: 指定应用程序的图标文件。pyinstaller --icon=app.ico yourscript.py
-
--add-data
: 添加非 Python 文件到可执行文件中,如数据文件或配置文件。pyinstaller --add-data 'datafile.txt:.' yourscript.py
-
--noconfirm
: 在打包过程中不进行用户交互确认。pyinstaller --noconfirm yourscript.py
其他参数
-
--clean
: 清理临时文件和缓存。pyinstaller --clean yourscript.py
-
--specpath
: 指定生成.spec
文件的路径。pyinstaller --specpath /path/to/specs yourscript.py
-
--debug
: 打印调试信息。pyinstaller --debug yourscript.py
注意事项
-
PyInstaller 默认会生成一个
dist
目录,在这个目录中你可以找到生成的可执行文件和其他打包所需的文件。 -
需要特别注意的是,有些第三方库可能需要特定的配置或者额外的处理才能正确打包。在使用 PyInstaller 打包应用程序时,建议先在简单的项目中测试,以确保所有依赖项都能正确打包进可执行文件中。
这些参数提供了灵活的选项,帮助你根据实际需求定制和优化打包过程。