【问题标题】:python subprocess is working in interactive mode but in not scriptpython子进程在交互模式下工作,但不是脚本
【发布时间】:2014-10-01 06:46:52
【问题描述】:

在 Windows 中,我必须执行如下命令:

process = subprocess.Popen([r'C:\Program Files (x86)\xxx\xxx.exe', '-n', '@iseasn2a7.sd.xxxx.com:3944#dc', '-d', r'D:\test\file.txt'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
process.communicate()

这在 python 交互模式下工作正常,但根本不能从 python 脚本执行。

可能是什么问题?

【问题讨论】:

  • @Ram,没有错误输出。
  • 如果打印返回值,会打印什么? print process.communicate()
  • 它在交互模式下打印从 process.communicate() 打印的内容,但没有执行。
  • 你的意思是脚本 with print 语句不打印任何东西吗?
  • 否,print process.communicate() 语句仅打印。但不仅仅是process.communicate()

标签: python windows python-2.7


【解决方案1】:

Popen.communicate 本身不打印任何内容,但它返回 stdout、stderr 输出。除此之外,因为代码在创建Popen时指定了stdout=PIPE, stderr=...,所以会捕获输出(不会让子进程直接打印输出到父进程的stdout)

需要手动打印返回值:

process = ....
output, error = process.communicate()
print output

如果你不想这样,不要通过省略 stdout=PIPE, stderr=... 来捕获标准输出。

那么,您不需要使用communicate,而只需使用wait

process = subprocess.Popen([...], shell=True)
process.wait()

或者,您可以使用 subprocess.call 来执行子进程并等待其终止:

subprocess.call([...], shell=True)

【讨论】:

  • 但在交互模式下,打印时没有打印语句。
  • @PDK,因为交互模式打印表达式的值(函数调用的返回值)。在交互模式和脚本中尝试1 + 2
  • @PDK,不是。这是我刚刚录制的截屏视频。
  • 系统命令根本没有从脚本执行。无论如何我可以验证在 python 中执行的命令的退出状态吗?
  • @kumarprd 等待,调用两者都返回退出状态。
猜你喜欢
  • 2018-07-02
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
相关资源
最近更新 更多