需要使用python从以下代码的cmd命令获取返回代码

时间:2018-02-01 15:20:59

标签: python cmd subprocess popen schtasks

这是我想在cmd中使用python运行的代码,我想让它返回我在程序中继续执行的数据

SCHTASKS /query /TN TaskName >NUL 2>&1

如您所见,如果找不到TaskName,此代码可能会返回false值。

我想得到这样的数据,即:如果任务确实存在,我需要返回一些错误代码,并且当它存在时需要获得不同的返回代码。

我尝试使用

var=subprocess.Popen(["start", "cmd", "/k", "SCHTASKS /query /TN TaskName >NUL 2>&1"], shell = True)
print var

但这只是给了我一些记忆中的对象位置。由于这是使用cmd的帮助,因此似乎需要使用不同的语法来返回。

1 个答案:

答案 0 :(得分:1)

请勿使用start在后​​台启动,因为您无法获得返回代码或输出。

如果您只想要命令的返回码并隐藏输出/错误消息,只需创建一个Popen对象,然后等待任务完成:

p = subprocess.Popen(["SCHTASKS","/query","/TN","TaskName"],stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
return_code = p.wait()

Python 2没有DEVNULL,因此您必须手动打开空流(How to hide output of subprocess in Python 2.7):

with open(os.devnull, 'w')  as FNULL:
    p = subprocess.Popen(["SCHTASKS","/query","/TN","TaskName"],stdout=FNULL, stderr=FNULL)
    return_code = p.wait()

如果你需要在后台执行此操作,请将以上代码包装在python线程中。也:

  • 始终将命令行参数作为列表传递,以便自动处理引用(如果需要)
  • 不要使用start,因为你失去了对这个过程的控制权。它的返回码。
  • 请勿使用shell=True,因为使用Popen重定向到DEVNULL更具便携性。