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

Python-如何使用管道执行Shell命令,但不使用'shell = True'?

葛永丰
2023-03-14
问题内容

我有一种情况想要在Python中执行以下shell命令并获取输出,

echo This_is_a_testing | grep -c test

我可以使用此python代码在python中执行上述shell命令,

>>> import subprocess
>>> subprocess.check_output("echo This_is_a_testing | grep -c test", shell=True)
'1\n'

但是,由于我 不想使用“ shell = True”选项 ,因此我尝试了以下python代码,

>>> import subprocess
>>> p1 = subprocess.Popen(["echo", "This_is_a_testing"], stdout=subprocess.PIPE)
>>> p2 = subprocess.Popen(["grep", "-c", "test"], stdin=p1.stdout)
>>> p1.stdout.close()
>>> p2.communicate()
(None, None)

我想知道为什么我参考网页中的描述时输出为“
None”:http :
//docs.python.org/library/subprocess.html#subprocess.PIPE

我是否错过了代码中的某些要点?有什么建议/想法吗?提前致谢。


问题答案:

从手册中:

要在结果元组中获得除None以外的任何内容,您需要提供stdout = PIPE和/或stderr = PIPE

p2 = subprocess.Popen(["grep", "-c", "test"], stdin=p1.stdout, stdout=subprocess.PIPE)


 类似资料:
  • 2. Shell如何执行命令 2.1. 执行交互式命令 用户在命令行输入命令后,一般情况下Shell会fork并exec该命令,但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程。以前学过的cd、alias、umask、exit等命令即是内建命令,凡是用which命令查不到程序文件所在位置的命令都是内建命令,内建命令没有单独的man手册,要在man手册

  • 我有一个案例,我想问我可以解决与Spring壳。我有一个Main.jar应用程序,它有几个部署在Wildly服务器上的Spring任务。在我的例子中,我不能停止或重新部署main.jar,因为必须不停地提供服务。

  • 问题内容: 我想知道是否有一种方法可以在Go中运行一定的时间,然后在从通道接收到值后将其杀死。在似乎不支持命令管道。谢谢。 问题答案: 这是我的管道示例,通过OS Std Pipe归档一个调用文件b,您可以对其进行编辑并添加计时器以执行所需的操作。 文件b:

  • 本文向大家介绍linux shell 管道命令(pipe)使用及与shell重定向区别,包括了linux shell 管道命令(pipe)使用及与shell重定向区别的使用技巧和注意事项,需要的朋友参考一下 看了前面一节:linux shell数据重定向(输入重定向与输出重定向)详细分析 估计还有一些朋友是头晕晕的,好复杂的重定向了。这次我们看下管道命令了。shell管道,可以说用法就简单多了。

  • 问题内容: 我试图找出Linux上是否存在程序,并且找到了本文。我尝试从go程序中执行此操作,但它始终提示我无法在$ PATH中找到“命令”,这是预料之中的,因为它是Linux中的内置命令,而不是二进制文件。所以我的问题是如何从go程序中执行linux的内置命令? 错误:执行:“命令”:在$ PATH中找不到可执行文件 问题答案: 就像那篇文章说的那样,“命令”是内置的shell。您可以通过go本

  • 问题内容: 我仍在尝试掌握如何运行linux或Windows shell命令并在node.js中捕获输出的细节。最终,我想做这样的事情… 重要的一点是必须对全局范围的变量(或对象)可用。我尝试了以下功能,但是由于某种原因,我被打印到控制台了。 我很难理解代码在哪里突破了…该模型的非常简单的原型可以工作… 有人可以帮助我了解为什么有效,但是无效吗?FWIW,我需要使用,因为缓冲区限制为200KB。