Python子进程调用无法接受grep

Python子进程调用无法接受grep,python,jython,Python,Jython,Python子进程调用应该按原样作为命令运行,但它会抱怨其中是否有管道。这是我的密码: #!/usr/bin/python import sys import subprocess import time service_name= "mysrvc" state ="STOPPED" mycmd ="sc query " + service_name + " " + "|" + " findstr" + " " + state print(mycmd) if subprocess.call(

Python子进程调用应该按原样作为命令运行,但它会抱怨其中是否有管道。这是我的密码:

#!/usr/bin/python

import sys
import subprocess
import time
service_name= "mysrvc"
state ="STOPPED"
mycmd ="sc query " + service_name + " " + "|" + " findstr" + " " + state 
print(mycmd)
if subprocess.call(mycmd)==0:
  print("Service stopped successfully")
我得到的错误是:

ERROR: Invalid Option; Would you like to see help for the QUERY and QUERYEX commands? [ y | n ]:
如果我将命令更改为

mycmd = "sc query " + service_name 
我能够成功运行脚本。这只是管道和它后面的参数的问题。如果我直接在命令行上运行
sc query mysvrc | findstr STOPPED
,它可以正常工作


我怎样才能让它工作?注意,我使用jython2.7运行这个python脚本。我没有成功地使用win32serviceutil,因为它找不到模块win32serviceutil。

我不确定具体的
jython
,但是文档建议您的命令需要是列表,而不是字符串,除非您将
shell
变量设置为
True
。如果将调用更改为
subprocess.call(mycmd,shell=True)
,则代码应该可以工作,但请务必阅读文档中有关将
shell
设置为
True
所固有的安全风险的警告


如果您不想设置
shell=True
,您将无法在命令中直接使用管道,但文档中有一节介绍如何使用
subprocess.Popen

模拟管道的功能,具体来说,我不确定
jython
,但是文档表明,除非将
shell
变量设置为
True
,否则命令需要是列表,而不是字符串。如果将调用更改为
subprocess.call(mycmd,shell=True)
,则代码应该可以工作,但请务必阅读文档中有关将
shell
设置为
True
所固有的安全风险的警告

如果不想设置
shell=True
,则无法在命令中直接使用管道,但文档中有一节介绍了如何使用
subprocess.Popen

模拟管道的功能,如前所述。但在这种情况下,你真的不需要管道。您可以让Python进行过滤,并完全避免管道到
findstr

# sc query command only, as list which gets better safety/performance
mycmd = ["sc", "query", service_name]

# Open command to run asynchronously, capturing output
proc = subprocess.Popen(mycmd, stdout=subprocess.PIPE)

# Wait for process to complete while slurping output
stdout, _ = proc.communicate()

# Check if expected output was seen and process exited successfully
if state in stdout and proc.returncode == 0:
    print("Service stopped successfully")
如前所述。但在这种情况下,你真的不需要管道。您可以让Python进行过滤,并完全避免管道到
findstr

# sc query command only, as list which gets better safety/performance
mycmd = ["sc", "query", service_name]

# Open command to run asynchronously, capturing output
proc = subprocess.Popen(mycmd, stdout=subprocess.PIPE)

# Wait for process to complete while slurping output
stdout, _ = proc.communicate()

# Check if expected output was seen and process exited successfully
if state in stdout and proc.returncode == 0:
    print("Service stopped successfully")

请将整个错误信息复制粘贴到您的问题中。有关更多信息,请参阅。我得到的错误是:错误:无效选项;是否要查看查询和QUERYEX命令的帮助?[y | n]:请在您的问题中包含错误信息——它将隐藏在评论中。请复制并粘贴整个错误信息到您的问题中。有关更多信息,请参阅。我得到的错误是:错误:无效选项;是否要查看查询和QUERYEX命令的帮助?[y | n]:请将您的问题包含在错误消息中——它将被隐藏在评论中。嗨!代码中的“状态”是什么?我收到以下错误:如果stdout和proc.returncode中的状态==0:NameError:name“state”未定义抱歉。。我了解这个国家的情况。我在“stdout和proc.returncode==0中的if状态”中添加了一个else来打印错误。当我执行它时,它总是转到其他部分。我认为它不是在标准输出中评估状态。我打印了标准输出,发现状态是“停止挂起”。这就是它失败的原因。我将编写一个whiledo循环,以保持查询,直到更改为STOPPED。那应该help@user1164061:很高兴你找到了答案。:-)我刚才才在电脑前看到你的评论。非常感谢你的帮助。嗨!代码中的“状态”是什么?我收到以下错误:如果stdout和proc.returncode中的状态==0:NameError:name“state”未定义抱歉。。我了解这个国家的情况。我在“stdout和proc.returncode==0中的if状态”中添加了一个else来打印错误。当我执行它时,它总是转到其他部分。我认为它不是在标准输出中评估状态。我打印了标准输出,发现状态是“停止挂起”。这就是它失败的原因。我将编写一个whiledo循环,以保持查询,直到更改为STOPPED。那应该help@user1164061:很高兴你找到了答案。:-)我刚才才在电脑前看到你的评论。非常感谢你的帮助。