我有一个很长的单行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
并读取awk
python程序中调用的结果。
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