当前位置: 首页 > 面试题库 >

为什么不在subprocess.Popen中使用`shell = True`在Python中呢?

裴彦
2023-03-14
问题内容

我有一个很长的单行shell命令,将由Python调用。代码如下:

# "first way"
def run_cmd ( command ):
    print "Run: %s" % command
    subprocess.call (command, shell=True)
run_cmd('''sort -n -r -k5 {3} |head -n 500|awk 'OFS="\t"{{if($2-{1}>0){{print $1,$2-{1},$3+{1},$4,$5}}}}' > {2}'''.format(top_count,extend/2,mid,summit))

这些代码有效,但始终会这样抱怨:

sort: write failed: standard output: Broken pipe
sort: write error
awk: (FILENAME=- FNR=132) fatal: print to "standard output" failed (Broken pipe)

根据先前的答案,我需要使用更长的脚本来完成此操作,例如:

# "second way"
p1 = Popen("sort -n -r -k5 %s"%summit, stdout=PIPE)
p2 = Popen("head -n 500", stdin=p1.stdout, stdout=PIPE)
# and so on ..........

我的问题是:

(1)“第二种方式”是否会比“第一种方式”慢

(2)如果无论如何我都必须以“第一种方式”写(因为这样写起来更快),如何避免这样的抱怨 broken pipe

(3)我不应该以“第一方式”写作的最令人信服的原因是什么


问题答案:

shell = True如果您的输入数据来自不受信任的来源,则使用可能会带来安全风险。例如,如果您的mid变量的内容是"/dev/null; rm -rf /"。在您的情况下似乎并非如此,因此我不必对此太担心。

在代码中,您将结果awk直接写入中的文件mid。要调试该问题,您可能需要使用subprocess.check_output并读取awkpython程序中调用的结果。

cmd = """sort -n -r -k5 %s |
      head -n 500|
      awk 'OFS="\t"{{if($2-{1}>0){{print $1,$2-{1},$3+{1},$4,$5}}}}'""".format(summit, top_count)

subprocess.check_call(cmd, shell=True, stdout=file)


 类似资料:
  • 问题内容: 我的交互式控制台的简要记录: 到底为什么呢? 编辑: 为了对比起见,请考虑运算符。 这使得有很大的意义,因为虽然和都意味着同样的事,作为一个条件语句,他们真的是不一样的东西。 再次编辑: 更有趣的后果: 问题答案: 因为Python中的Boolean是整数的子类型。从文档中: 布尔值是两个常量对象False和True。它们用于表示真值(尽管其他值也可以视为假或真)。在数字上下文中(例如

  • 问题内容: 当用于运行“ ”(仅作为示例)时,在Windows上我们得到以下信息: 因此,可以按照我的期望很好地打印出该版本。但是在Linux上,我们得到以下信息: 因为gcc尚未收到该选项。 文档没有明确指定Windows下的args应该发生什么,但是它确实说在Unix上, “如果args是一个序列,则第一项指定命令字符串,任何其他项都将被视为其他shell参数。 。” 恕我直言,Windows

  • 问题内容: MDC对操作员的描述如下: 如果两个操作数的类型不同,则JavaScript会转换操作数,然后进行严格比较。如果操作数是数字或布尔值,则在可能的情况下将操作数转换为数字;否则,操作数将转换为数字。否则,如果其中一个操作数是字符串,则另一个操作数将尽可能转换为字符串。 考虑到这一点,我将评估如下: 它们是同一类型吗? 没有 操作数是数字还是布尔值? 是 我们可以将它们都转换为数字吗? 否

  • 问题内容: 使用括号时,这些语句为什么能按预期工作: 但是 ,如果没有括号,它会返回吗? 问题答案: 基于有关操作符优先级的python 文档 : 请注意,比较,成员资格测试和身份测试均具有相同的优先级,并且具有“比较”部分中所述的从左到右的 链接 功能。 因此,实际上您有一个链接语句,如下所示: 您可以假定中心对象将在2个操作和其他对象之间共享(在这种情况下为False)。 并且请注意,对于所有

  • 问题内容: 为什么在Python 2中返回? 是因为当我在数字周围加上单引号时,Python会将其视为字符串并且字符串大于数字吗? 问题答案: 是的,任何数字都将小于Python 2中的任何字符串(包括空字符串)。 在Python 3中,您无法进行任意比较。你会得到一个。 从 eryksun的评论链接中: 因此,至少在最新版本的CPython 2.x中,将比较类型名称,并使用空字符串代替任何数字类

  • 问题内容: 有没有一种方法可以终止以subprocess.Popen类开头且“ shell”参数设置为“ True”的进程?在下面的最小工作示例(使用wxPython)中,您可以愉快地打开和终止记事本进程,但是,如果将Popen的“ shell”参数更改为“ True”,则记事本进程不会终止。 为了这个问题,请接受“ shell”必须等于“ True”。 问题答案: 根据Thomas Watned