有时我们写的一些python程序,由于每天都经常使用,因此不希望每次都打开IDE客户端或者cmd命令去执行,我们可以写一些bat脚本,每次需要执行时,双击一下脚本就可以了。我这里以一个放烟花的py脚本程序为例。
1.首先新建一个.txt文本文件,我们所需要写的命令行在这里面编写
2.接下来进行命令行介绍
rem 1注释:关闭回显
@echo off
rem 2注释:激活我们的虚拟环境
call activate python37
rem 3注释:切换路径到要执行的脚本文件目录位置
cd /d D:\temporary\fireworks-main
rem 4注释:执行python文件
python fireworks.py
rem 5注释:执行文件后,暂停
pause
注:
(1)rem :只是每一行命令的注释,可以去掉,即
@echo off
call activate python37
cd /d D:\temporary\fireworks-main
python fireworks.py
pause
(2)@echo off:一般直接将其放于程序的最上方就行了,它的作用是关闭回显,即在批处理运行命令的时候不会一条一条的显示执行的命令,只显示了命令的输出,而不是命令本身,这在编写较长的批处理文件时尤其有用,可以使输出结果更加简洁明了。与之相匹配的还有@echo on是打开回显。
示例
没有使用?@echo off
?的情况下,批处理文件中的每一条命令及其输出都会显示。例如:
echo Hello World!
执行上述批处理文件将会显示:
echo Hello World!
Hello World!
使用了?@echo off
?后:
@echo off
echo Hello World!
仅显示:
Hello World!
(3)call activate python37:是激活我们自己的虚拟环境,也可以先cd 到虚拟环境所在的目录文件夹下再activate激活,也可直接activate+虚拟环境名激活。还有一点,bat文件中,激活虚拟环境时,使用到call,功能是执行某个文件,更多详情自行百度。功能类似于python +文件。如果不添加call,激活环境会失败。
(4)cd /d D:\temporary\fireworks-main:切换到程序目录,这里注意,bat文件内的路径和文件名称,最好不要出现中文,容易报错。
(5)python fireworks.py:是执行py脚本命令,也可以使用start python fireworks.py,加start与不加的区别是:
不加start则执行后py脚本是在当前cmd窗口执行,如下所示
加start则执行后py脚本会新开一个窗口来执行,如下所示
(6)pause:bat文件中的"pause",如果不添加,执行bat文件后,屏幕就会闪一闪,很快就关闭CMD窗口。如果添加“pause”执行bat文件后,CMD窗口会保持,并提示“请按任意键继续...”,按下任意键后才关闭窗口。可以先加上这句,执行起来,看有没有报错,没有的话可以再去掉这句,如果有错误,加上这句方便在窗口查看错误是啥
3.最后将写好的.txt文本内容保存,修改txt格式为.bat格式
4.双击运行就OK啦!
上面步骤只是简单介绍一个小demo只有一个main主程序执行示例,但往往对于一个大型项目,我们需要同时执行多个py脚本程序,也就是开启多个进程,让他们并行执行互不干扰,那就可以像下面这样做
rem 1注释:关闭回显
@echo off
rem 2注释:激活我们的虚拟环境
call activate python37
rem 3注释:切换路径到要执行的脚本文件目录位置
cd /d D:\temporary\fireworks-main
rem 4注释:执行python文件
start python fireworks.py
rem 5注释:切换路径到要另一个要执行的脚本文件目录位置
cd /d D:\temporary\Camera-calibration-image-fusion-main
rem 6注释:执行另一个python文件
start python main.py
rem 7注释:执行文件后,暂停
pause
效果如下:
注意:
当多个程序时,如果你不使用start python xx.py而是直接python xx.py,会出现一个问题,就是只有在当你将第一个程序窗口关闭之后,第二个程序窗口才会出来,没法同时展现出来,即此时他们就不是并行执行的关系了。而是一个执行结束之后,另一个才会执行起来
加start后台进程
不加start后台进程
关闭fireworks界面后,另一个才会出现
再多说几句:
(1)python?xx.py?& python?xx1.py?& python?xx2.py?# 前一个运行结束后,后面一个才会执行:
? 如果你都多个程序要执行,且这些程序在同一个文件夹,可以这样写
rem 3注释:切换路径到要执行的脚本文件目录位置
cd /d D:\temporary\fireworks-main
rem 4注释:执行python文件
python fireworks.py & python fireworks-old.py
效果和上面说的两个程序不加start一个效果
(2)python?xx.py?&& python?xx1.py?&& python?xx2.py?# 前一个运行成功后,才运行后面一个:
? ?这样写效果和(1)一样
rem 3注释:切换路径到要执行的脚本文件目录位置
cd /d D:\temporary\fireworks-main
rem 4注释:执行python文件
python fireworks.py && python fireworks-old.py
(3)python?xx.py?|| python?xx1.py?|| python?xx2.py?# 前一个运行失败后,才运行后面一个:
这里我把第一个程序fireworks.py少些一个s变成firework.py使其因文件名错误而执行失败,发现后面的程序在这个程序执行失败后正常执行
rem 3注释:切换路径到要执行的脚本文件目录位置
cd /d D:\temporary\fireworks-main
rem 4注释:执行python文件
python firework.py || python fireworks-old.py
(4)还有一种写法python?xx.py?; python?xx1.py?; python?xx2.py?#这种写法是不行的,只会执行第一个脚本
我们前面也看到了,如果我们同时并行执行多个py脚本程序,需要用到start而且每一个脚本都会开启一个窗口,这样我们一执行就蹦出来好多窗口,感觉怪怪的,尤其给别人演示的时候,那么我们就可以写命令start /min python xx.py,让这些程序在打开执行的时候就窗口直接最小化不蹦出来就可以了
start /min python fireworks.py
start /min python main.py
这样就只会有一个原始的cmd窗口蹦出来,如果这个窗口也不想要显示,直接将pause这行命令去掉即可。
我们的命令可以让我们直接打开某个网页,命令如下:
rem 1注释:关闭回显
@echo off
rem 2注释:激活我们的虚拟环境
call activate python37
rem 3注释:切换路径到要执行的脚本文件目录位置
cd /d D:\temporary\fireworks-main
rem 4注释:执行python文件
start /min python fireworks.py
rem 5注释:切换路径到要另一个要执行的脚本文件目录位置
cd /d D:\temporary\Camera-calibration-image-fusion-main
rem 6注释:执行另一个python文件
start /min python main.py
rem 7注释:打开百度网页
start https://www.baidu.com/
我们还可以给我们的bat文件添加图标,但是图标格式只能是ico格式的
1、找到要修改图标的的BAT文件
2、将该BAT文件移动到任意盘符中(不建议放置在C盘)
3、在该BAT文件上右击,选择“发送到”-“桌面快捷方式”
4、在桌面上找到BAT文件的快捷方式
5、在该快捷方式上右击,选择“属性”
6、在弹出的界面中找到“更改图标”按钮
7、在弹出的界面中选择合适的图标,并点击“确定”
8、根据提示点击“应用”- “确定”
9、图标修改完成
这以后就可以当作.exe程序似的双击直接使用了
四、总结
虽然在DOS和Windows(任意)系统中,用户可以当作一种程序部署方式,像执行.exe文件一样直接执行bat命令文件,从而大大简化日常或重复性任务,无需再调用dos窗口和击入dos命令。但是这种部署往往只限制于当前计算机(即所有项目环境都搭建好的计算机),如果想部署到新的计算机上,则需要将所需环境再迁移一遍过去(简单例子,如果你使用虚拟环境,程序所需的一些依赖包只有将环境迁移过去才可以找到,但是这种环境迁移也不麻烦,如果你自己在一个计算机上配置过一遍环境,如果你不更换系统,可以直接用硬盘将所有的环境直接拷贝过去就可以直接使用,如果想避免麻烦,还可以像原计算机一样,在相同的盘符,建立相同名称的文件夹,然后将东西拷贝过来,这样连程序中的文件路径都不需要改,但是如果计算机用户名称不一样的话,需要改一下,比如原计算机用户名为User新计算机用户名为Admin,这个环境迁移后,程序中路径这块名称记得改,否则会出现找不到文件的报错,这种方法对于虚拟环境同样适用)
当然如果不想每次都迁移环境,可以将程序封装成.exe,这种封装会将所需依赖自动查找并打包好,详细方法可以参考我另外两篇文章: