使程序输出不适用于某些程序

时间:2014-08-05 20:34:34

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

我正在尝试获取名为CheckLog的Windows CLI程序的输出(随Exact Audio Copy一起提供),我已经搜索了我的问题的解决方案的高低,但我可以' t为我的生命得到输出(返回''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(昨晚安装)。

2 个答案:

答案 0 :(得分:0)

三点:

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,
    )

答案 1 :(得分:0)

关于从精确音频拷贝中捕获CheckLog.exe程序输出主题的几点:

1)CheckLog.exe输出到stdout。

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'