【发布时间】:2018-04-12 20:00:57
【问题描述】:
使用stdout=subprocess.PIPE 会阻止输出进入控制台,但不会捕获任何内容。
>>> import subprocess
>>> proc = subprocess.Popen(['C:\\Users\\me\\program.exe'])
>>> ERROR: please provide an argument
// TRUNCATED USAGE OUTPUT
proc.wait()
0
>>> proc = subprocess.Popen([''C:\\Users\\me\\program.exe''], stdout=subprocess.PIPE)
>>> proc.communicate()
('', None)
我已经尝试了 stackoverflow 上所有可用的组合。 shell=True 没有用。生成子 cmd 没有奏效。 subprocess.check_output 什么也没捕获。我很高兴在 cmets 中重试这些命令中的任何一个。
我猜这与程序是否附加到外壳有关。
这是程序用来输出的程序集(mcall 只是一个将内存对齐到 16 位的宏)。我包含此内容的原因是,以防GetStdHandle 影响事物。
console_write PROC
; rcx MSG
; rdx LEN
prologue
push rcx
push rdx
xor rcx, rcx
mov ecx, [stdout]
mcall GetStdHandle
mov rcx, rax
xor rdx, rdx
pop r8 ; len
pop rdx ; msg
push 0
mov r9, rsp
push 0
mcall WriteConsoleA
pop rcx
pop rcx
epilogue
console_write ENDP
我被这个难住了。我在 Linux 上做过很多次。我只是不太了解 Windows 内部结构来解决这个问题。谢谢!
编辑:我尝试过的其他事情:
管理员(也带有 STDERR 捕获)
C:\Windows\system32>C:\Python27\python.exe
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> proc = subprocess.Popen(['C:\\Users\\me\\program.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> proc.communicate()
('', '')
STDOUT 文件重定向
>>> import os
>>> os.system('C:\\Users\\me\\program.exe > out.txt')
0
>>> f = open('out.txt', 'r')
>>> f.read()
''
STDERR 文件重定向
>>> import os
>>> os.system('C:\\Users\\me\\program.exe 2>out.txt')
ERROR: please provide an argument
// TRUNCATED USAGE OUTPUT
0
>>> open('out.txt', 'r').read()
''
命令行捕获失败(禁止输出到 cmd,但没有捕获任何内容)
program.exe > out.txt
【问题讨论】:
-
你试过 stderr 了吗?
-
是的。同样的问题。
>>> proc.communicate() ('', '')(另一条评论中的完整命令) -
或者你应该以管理员身份运行它,你检查了吗?
-
你可以在 cmd 上看到它的输出,对吧?所以,把它写在一个 .bat 文件中,然后用你的 python 脚本启动那个 bat 文件,看看会发生什么......
-
EXE 没问题。用 ML64 组装(我今天重建了它,没有任何变化)。它输出到控制台并返回 0。捕获标准输出会抑制输出但无法捕获。
标签: python windows winapi cmd subprocess