【问题标题】:Need to get return code from cmd command of the below code using python需要使用python从以下代码的cmd命令获取返回码
【发布时间】:2018-02-01 15:20:58
【问题描述】:

这是我想使用 python 在 cmd 中运行的代码,我希望它返回我在程序中相应处理的数据

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 的帮助,它似乎需要不同的返回语法。

【问题讨论】:

标签: python cmd subprocess popen windows-task-scheduler


【解决方案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 更便携。

【讨论】:

  • DEVNULL 仅适用于 python 3。尝试不进行所有重定向,看看它是否适合您。我稍后会编辑
猜你喜欢
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多