zoukankan      html  css  js  c++  java
  • 如何在batch脚本中嵌入python代码

    老板叫我帮他测一个命令在windows下消耗的时间,因为没有装windows那个啥工具包,没有timeit那个命令,于是想自己写一个,原理很简单:

    REM timeit.bat
    
    echo %TIME%
    call %*
    echo %TIME%

    然后两个时间减一下就可以了,但是总是自己去减始终不方便,最好能直接算好打印出来。

    因为涉及到时间格式的解析,时间的运算,在batch下比较困难,自然就想到了python或者perl脚本,这里首先想到的是python的-c参数:

    REM timeit.bat
    
    set t1 = %TIME%
    call %*
    set t2 = %TIME%
    python -c "some python code to compute the time elapsed"

    但是,由于计算的代码会比较复杂,直接放在一行上非常难写,也非常难读,最好能分多行写python代码,我们知道bash中有个heredoc,结合python的 “-” 参数:

    # test.sh
    
    echo this is a bash script
    python - <<EOF
    import math
    print "this is python code"
    print math.pi
    EOF

    无奈,batch并不支持heredoc,所以在要在batch中实现这个,用到一个非常magic的方法:原理就是我的脚本既是合法的batch,也是合法的python,然后在batch运行的最后用python调用自身:

    1># : ^
    '''
    set t1 = %TIME%
    call %*
    set t2 = %TIME%
    python %~f0"
    exit /b
    rem ^
    '''
    import os
    import datetime
    # python code to compute the time elapsed
    print "Time Elapsed: xxx"

    具体解释可以看这个问题:http://stackoverflow.com/questions/17467441/how-to-embed-python-code-in-batch-script

    注意第一行奇怪的语法只是为了把第二行合法的移到第一行,从而避免三个单引号这个非法命令调用出现在batch中。

    完整的timeit的实现在这里:https://github.com/lzprgmr/privaterepo/blob/master/tools/Batch/timeit.bat

    最后,当然有人会说为什么不直接写一个py然后在batch中调用 - 这当然可以,但我想尽量保持一个功能在一个脚本中,这样看起来整洁,给别人用拷来拷去也不容易出错。

  • 相关阅读:
    input输入框的各种样式
    Spring JdbcTemplate方法详解
    TF/IDF计算方法
    分布式日志收集系统--Chukwa
    分布式日志系统
    Iframe知识点
    拖拽事件
    面向对象知识点
    JS使用合并数组
    块元素block,内联元素inline; inline-block;
  • 原文地址:https://www.cnblogs.com/baiyanhuang/p/3174776.html
Copyright © 2011-2022 走看看