为何无法执行Python 3.7文档中的timeit示例?
为啥Windows下timeit命令报错?这锅得命令行的引号解析背!
嘿,这个问题我之前帮朋友排查过,核心原因就是Windows的cmd/PowerShell和Linux/msys2的shell对引号的处理逻辑完全不一样!
在Linux或者msys2的环境里,单引号'是用来划定字符串边界的,shell会把单引号里的内容原封不动传给timeit模块。但Windows的命令行不认单引号当字符串边界——它会把单引号当成普通字符来处理,这就直接把你的命令拆得乱七八糟:
-s参数的内容被截断成了text = "sample string,后面的; char = "g"变成了独立的无效参数- 后面的
char in text也因为引号解析错误,导致Python读到不完整的字符串,最终抛出SyntaxError: EOL while scanning string literal(扫描字符串时碰到了行尾)的报错。
给你两种快速解决的办法:
方法1:调整引号的使用方式(适配Windows命令行)
针对不同的Windows命令行工具,引号的写法略有区别:
- 在cmd里:把外层的单引号换成双引号,内部的双引号用
\"转义,命令改成这样:python -m timeit -s "text = \"sample string\"; char = \"g\"" "char in text" - 在PowerShell里:更灵活,要么用反引号``"`转义内部双引号,要么直接用单引号包裹内部的字符串,外层用双引号:
或者:python -m timeit -s "text = 'sample string'; char = 'g'" "char in text"python -m timeit -s 'text = "sample string"; char = "g"' 'char in text'
方法2:改用脚本执行(彻底避开命令行引号坑)
如果觉得命令行转义太麻烦,直接写个小Python脚本更省心。比如创建timeit_demo.py:
import timeit # 定义setup和stmt内容 setup_code = 'text = "sample string"; char = "g"' stmt_code = 'char in text' # 执行timeit并打印结果 time_result = timeit.timeit(stmt=stmt_code, setup=setup_code) print(f"执行耗时:{time_result} 秒")
然后直接运行python timeit_demo.py就行,完全不用管命令行的引号问题~
最后总结一下
本质就是不同系统的命令行解析器对引号的规则不一样,只要调整引号写法或者改用脚本,就能轻松解决这个问题啦!
内容的提问来源于stack exchange,提问作者user10957988
相关产品推荐
相关产品推荐

