Python 如何将timeit与包含EOL字符的命令一起使用?

Python 如何将timeit与包含EOL字符的命令一起使用?,python,windows,cmd,timeit,Python,Windows,Cmd,Timeit,我试图学习如何使用timeit为python驱动的命令行参数计时 from subprocess import * import timeit p = Popen( ["cmd.exe"], stdin=PIPE, stdout=PIPE ) dir_time = timeit.timeit('p.stdin.write("dir\n"),p.stdin.write("exit\n")') print p.stdout.read() 不幸的是,当我运行它时,我得到了 exceptions.S

我试图学习如何使用timeit为python驱动的命令行参数计时

from subprocess import *
import timeit

p = Popen( ["cmd.exe"], stdin=PIPE, stdout=PIPE )
dir_time = timeit.timeit('p.stdin.write("dir\n"),p.stdin.write("exit\n")')
print p.stdout.read()
不幸的是,当我运行它时,我得到了
exceptions.SyntaxError:EOL在扫描字符串文字时(第6行,偏移量26):'p.stdin.write('dir'

我见过一个,它的解决方案是替换单引号,但是我没有将代码片段直接输入cmd,它们的命令中从不包含结束行字符,双引号会产生语法错误


是否有任何方法可以分隔行尾字符,但在cmd中仍然有效?我是否对timeit中的两个参数使用了不正确的语法?

要解决EOL的直接问题,可以使用原始字符串文字:
r'p.stdin.write(“dir\n”),…'
(注意:
r'
)否则,
\n
将被解释为导致您看到的错误的换行符:

>>> import timeit
>>> timeit.timeit('"a" + "\n"')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/timeit.py", line 230, in timeit
    return Timer(stmt, setup, timer).timeit(number)
  File "/usr/lib/python2.7/timeit.py", line 136, in __init__
    code = compile(src, dummy_src_name, "exec")
  File "<timeit-src>", line 6
    "a" + "
          ^
SyntaxError: EOL while scanning string literal
更普遍的问题是:

  • timeit(r'p.stdin.write(“dir\n”)、p.stdin.write(“exit\n”))
    不起作用

    p
    可能无法访问(
    namererror

  • 即使它已经工作,它也不会测量在
    cmd.exe中运行
    dir
    命令所需的时间

    它将测量将命令写入内部
    python
    文件缓冲区和/或通过管道将其推送到
    cmd.exe

  • 否则会引发IOError/OSError

    第一次执行
    exit
    后,管道可能会关闭。
    timeit
    多次运行代码(默认为1000000)

看起来是这样的。如果您想知道如何测量在
cmd.exe
中运行内部命令所需的时间,请直接作为新问题提问


timeit
在这里不是一个合适的工具。

这段时间不就是将命令发送到shell需要多长时间,而不是命令运行多长时间吗?我假设它必须等待stdout从第一个命令到达,然后才发送出口,但这只是我的逻辑,而不是技术理解我想EOL是由
\n
引起的,所以你应该在
p.stdin.write(“dir\n”)
中转义
\
,如下所示:
p.stdin.write(“dir\\n”)
>>> timeit.timeit(r'"a" + "\n"')
0.021812915802001953