【问题标题】:Getting program output not working for certain programs获取程序输出不适用于某些程序
【发布时间】:2014-09-28 15:31:55
【问题描述】:

我正在尝试获取名为 CheckLog(随 Exact Audio Copy 一起提供)的 Windows CLI 程序的输出,并且我一直在寻找解决问题的方法,但我终生都做不到我得到输出(返回''b'')。它实际上可以与其他应用程序一起使用(在 Microsoft OEM 支持工具包中测试了 nfi),所以我不知道问题可能是什么......这是我测试的最新代码:

# -*- coding: utf-8 -*-
import sys, os, subprocess

checklog_path = os.environ['programfiles'] + '\\Exact Audio Copy\\CheckLog.exe'
log_path = 'C:\EAClog.log'

EAC = subprocess.Popen([checklog_path, log_path], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)

EACoutput = EAC.communicate()[0]

不过我也试过这个:

EACoutput = EAC.stdout.read()

有什么想法吗?我正在 Windows XP 上运行全新安装的 Python 3.4(昨晚安装)。

【问题讨论】:

标签: python windows io stdout command-line-interface


【解决方案1】:

三点:

1) 在 Python 中,反斜杠是一个“引号”字符——这往往会混淆 Windows 路径。使用 Python 原始字符串——例如:r"c:\\beer.exe"

2) subprocess.check_output()` 是运行命令并获取其输出的最简单、最可靠的方法。

3) 在 Python 中,您可以将字符串混合在一起以获得文件路径,但要正确处理可能会很棘手。使用os.path.join() 来简化代码。 Perk:它是跨平台的。

# -*- coding: utf-8 -*-
import sys, os, subprocess

checklog_path = os.path.join(
    os.environ['programfiles'],
    r'Exact Audio Copy\CheckLog.exe', # no leading backslash
    )
log_path = r'C:\EAClog.log'

EACoutput = subprocess.check_output(
    [checklog_path, log_path], 
    stderr=subprocess.STDOUT,
    )

【讨论】:

  • os.path.join 函数由于某种原因返回 C:\Exact Audio Copy\CheckLog.exe 而不是 C:\Program Files\Exact Audio Copy\CheckLog.exe(在我的系统上应该如此)。此外,check_output() 不允许 stdout 参数,因此会引发错误。
  • @user966939 我已经编辑了代码,请再看一遍,如果对您有用,请将答案标记为已接受。
  • 是的,路径现在按预期出来了。但它仍然无法从 CheckLog 收集输出。
  • @user966939 CheckLog 是否写入标准错误或标准输出?
  • 抱歉,我不知道它写的是什么......它不是开源的(我不知道它是否有可能以某种方式看到)。
【解决方案2】:

关于从 Exact Audio Copy 捕获CheckLog.exe 程序的输出的主题:

1) CheckLog.exe 输出到标准输出。

2) 在 Windows shell 中重定向输出也会失败:

C:\Program Files (x86)\Exact Audio Copy>CheckLog.exe %logpath%
Log Integrity Checker   (C) 2010 by Andre Wiethoff

1. Log entry has no checksum!

C:\Program Files (x86)\Exact Audio Copy>CheckLog.exe %logpath% 1> %temp%\stdout.
txt

C:\Program Files (x86)\Exact Audio Copy>dir %temp%\stdout.txt
 Volume in drive C has no label.
 Volume Serial Number is 1B3A-F950

 Directory of C:\Users\marius\AppData\Local\Temp

04.09.2014  08:35                 0 stdout.txt
           1 File(s)              0 bytes
           0 Dir(s)  171.767.508.992 bytes free

C:\Program Files (x86)\Exact Audio Copy>CheckLog.exe %logpath% 2> %temp%\stderr.
txt
Log Integrity Checker   (C) 2010 by Andre Wiethoff

1. Log entry has no checksum!

C:\Program Files (x86)\Exact Audio Copy>CheckLog.exe %logpath% | cat

C:\Program Files (x86)\Exact Audio Copy>echo 'hello world' | cat
'hello world'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多