bat 打开cmd 执行Python文件

bat 打开cmd 执行Python文件,第1张

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文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9744601.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存