【问题标题】:Python does not run shell command properlyPython 无法正确运行 shell 命令
【发布时间】:2014-01-18 04:58:39
【问题描述】:

我有以下 python sript -

import os
command = "echo '12345 Tomcat' | sed -n 's/.*\(^.[0-9]*\).*/\1/p'"
os.system(command)

它打印 ascii 零字符 -

尝试在 shell 中运行此命令。它应该打印12345

这是为什么?

【问题讨论】:

  • 也许反斜杠需要转义?
  • @user000001 是的。现在我觉得自己很傻。
  • 另外,如果上述命令是您想要实现的,您可能需要考虑在字符串上使用re 模块或.split() 方法。
  • @GertvandenBerg 对于知道如何编写regex 和使用sed 的人,你认为我不会知道吗? :) 这是我的命令的精简版本,只是为了说明这一点。
  • @KshitizSharma 这就是为什么它是一个评论......并且“如果”在开头;)

标签: python linux bash shell sed


【解决方案1】:

Python 正在解释您的反斜杠。您可以改用“原始”Python 字符串表示法:

command = r"echo '12345 Tomcat' | sed -n 's/.*\(^.[0-9]*\).*/\1/p'"

或者,再次转义反斜杠:

command = "echo '12345 Tomcat' | sed -n 's/.*\\(^.[0-9]*\\).*/\\1/p'"

【讨论】:

【解决方案2】:

\1 是一个转义序列(这是您的图像实际显示的,而不是\0)。您想将其视为字符 \1,因此在您的字符串前面加上 r 以使字符串文字“原始”:

command = r"echo '12345 Tomcat' | sed -n 's/.*\(^.[0-9]*\).*/\1/p'"

【讨论】:

  • 哦...不知道r"..." 语法。从哪个版本开始,是否支持这种语法? (问是因为我可能要处理旧的python版本(版本
  • @anishsane:该语法是在 Python 1.5 中引入的:python.org/download/releases/1.5/whatsnew
猜你喜欢
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 2022-11-18
  • 2016-05-28
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
相关资源
最近更新 更多