python编码启动cmd批处理文件(bat文件),用subprocess方法可以将相应的cmd输出获取到,代码如下:
#import os
#ossystem("c:\\sambat")
import subprocess
cmd = 'cmdexe c:\\sambat'
p = subprocesspopen("cmdexe /c" + "c:\\sambat abc", stdout=subprocesspipe, stderr=subprocessstdout)
curline = pstdoutreadline()
while(curline != b''):
print(curline)
curline = pstdoutreadline()
pwait()
print(preturncode)sambat批处理文件代码:
echo hello world!
echo show %1%
笨办法是在循环中不断读取目录以及目录中文件的最后修改时间,如果有变更,则说说文件被修改。
这种办法需要不断的循环读取文件信息,这对cpu占用较高,同时也会产生一定的磁盘IO,短时间小范围使用尚可,如果长时间运行在服务器上,或者监控一个包含很多文件的目录则不可取。
办法之二是利用 *** 作系统提供的功能来实现。
比如在Windows中,可以利用Windows APIReadDirectoryChangesW来实现。这可以免去大量的磁盘IO。因为文件修改的频率一般不高,可以使用定计时器进行循环,对cup的占用也会少很多。
第一个执行后并没有结果,因为随着执行返回,当前目录就改变了。
第二个可以切换当前目录。
第三个跟第二个配合使用应该可以。或者用 ospathjoin(DstDir,'testbat') 来直接引用绝对路径
bat文件虽然说是一个由dos命令所组成的结合体,但是它只需要双击就可以启动并且在命令行之中去运行,也可以使用记事本的方式打开来查看bat文件里面的内容。而且bat文件如果是在命令行之中的话就可以直接输入bat文件所在的路径去执行它,它和txt文件本质上是没有区别的。
那么只要bat文件可以在命令行之中去执行,那么就可以用python中的system()这个方法了。system()方法是python内置模块os的一个方法,它的作用就是把方法内的参数都当做是命令行的命令去执行,它会去隐式的调用dos。
也就是说只需要将bat文件的路径以字符串个是放在system()方法的参数里面就可以在执行python代码时运行bat文件了,示例如下:
# 导入模块
import os
ossystem(’E:\\sys\\edg\kbsjbat’)
代码编写完毕之后按F5或者是在交互模式下按回车就能执行代码,代码在执行的时候就会自动的打开命令行并去执行bat文件内的命令了。
1 使用装饰器来衡量函数执行时间
有一个简单方法,那就是定义一个装饰器来测量函数的执行时间,并输出结果:
import time
from functoolsimport wraps
import random
def fn_timer(function):
@wraps(function)
def function_timer(args, kwargs):
t0= timetime()
result= function(args, kwargs)
t1= timetime()
print("Total time running %s: %s seconds" %
(function__name__, str(t1- t0))
)
return result
return function_timer
@fn_timer
def random_sort(n):
return sorted([randomrandom() for i in range(n)])
if __name__== "__main__":
random_sort(2000000)
输出:Total time running random_sort: 06598007678985596 seconds
使用方式的话,就是在要监控的函数定义上面加上 @fn_timer 就行了
或者
# 可监控程序运行时间
import time
import random
def clock(func):
def wrapper(args, kwargs):
start_time= timetime()
result= func(args, kwargs)
end_time= timetime()
print("共耗时: %s秒" % round(end_time- start_time, 5))
return result
return wrapper
@clock
def random_sort(n):
return sorted([randomrandom() for i in range(n)])
if __name__== "__main__":
random_sort(2000000)
输出结果:共耗时: 065634秒
2 使用timeit模块
另一种方法是使用timeit模块,用来计算平均时间消耗。
执行下面的脚本可以运行该模块。
这里的timing_functions是Python脚本文件名称。
在输出的末尾,可以看到以下结果:4 loops, best of 5: 208 sec per loop
这表示测试了4次,平均每次测试重复5次,最好的测试结果是208秒。
如果不指定测试或重复次数,默认值为10次测试,每次重复5次。
3 使用Unix系统中的time命令
然而,装饰器和timeit都是基于Python的。在外部环境测试Python时,unix time实用工具就非常有用。
运行time实用工具:
输出结果为:
Total time running random_sort: 13931210041 seconds
real 149
user 140
sys 008
第一行来自预定义的装饰器,其他三行为:
real表示的是执行脚本的总时间
user表示的是执行脚本消耗的CPU时间。
sys表示的是执行内核函数消耗的时间。
注意:根据维基百科的定义,内核是一个计算机程序,用来管理软件的输入输出,并将其翻译成CPU和其他计算机中的电子设备能够执行的数据处理指令。
因此,Real执行时间和User+Sys执行时间的差就是消耗在输入/输出和系统执行其他任务时消耗的时间。
4 使用cProfile模块
5 使用line_profiler模块
6 使用memory_profiler模块
7 使用guppy包
大图请右击在新标签页打开
Popen默认shell参数为False:
为True时默认使用 COMSPEC 环境变量指定的程序为shell:
在Windows上默认为cmd:
args参数为命令字符串时,因为dir是cmd的内建命令,需要指定shell=True:
例如:
而timeout,ping等都是独立的exe,可以不需要cmd:
args参数是文件路径形式时:
底层是调用了Windows的API,如下:
调试:
测试:
从调试结果以及测试来看,对于bat文件,可以不写lpApplicationName参数,Windows会自动使用cmd来运行(使用vbs文件测试返回错误:不是正确的win32程序,要指定lpApplicationName为cscriptexe才行,可能只有bat才有这个特权了)。
输入重定向的问题:
Popen是用创建子进程的方式来执行的,而timeoutexe在暂停时,可接受用户按键来终止,这个时候会需要输入,但是Popen给子进程的stdin只有
并不能让timeout重定向到用户输入上,所以出错。
解决的方法有很多,最简单的替换掉timeout语句为ping -w xxx 127001 或者直接由python来接管timeout。
@echo off
rem 这里的D:和D:\Python 是Python文件所在的盘及路径
D:
cd D:\Python
python testpy
pause
exit
以上就是关于bat 打开cmd 执行Python文件全部的内容,包括:bat 打开cmd 执行Python文件、python 监控一个文件夹、关于在python中使用os.system运行批处理.bat文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)