Python2:子流程.Popen()有另一个输出,因为它直接在cons上运行

2024-04-20 03:04:17 发布

您现在位置:Python中文网/ 问答频道 /正文

当我在控制台中运行一个程序时,我得到一些文本输出。 当我在Popen(..)中运行同一个程序时,参数相同,stdout和stderr为空。在

我尝试了我能想到的一切,比如shell=False和shell=True,设置stdout=子流程.管道,做了一个os.chdir公司()若要切换到此程序的目录,请尝试p.wait()和p.communicate(),将命令设置为列表和字符串,但没有任何效果。在

示例:

p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
out, err = p.communicate()

-->;out和err是空字符串,但如果在控制台中运行此命令,则会得到实际输出。命令带有完整路径,因此无论命令将从何处启动都是如此。在

我的问题是,程序是否有机制来检测它们没有在真正的控制台中运行?如果是这样,我怎么能作弊呢。在

或者想念我什么的?在

(Python 2.7.8。Win7 x64中的x32)


Tags: 字符串文本命令程序true参数stderrstdout
1条回答
网友
1楼 · 发布于 2024-04-20 03:04:17
from subprocess import Popen, STDOUT, PIPE
p = Popen(command, shell=True, stdout=PIPE, stderr=STDOUT, stdin=PIPE)
while p.poll() is None:
    print(p.stdout.read())
p.stdout.close()
p.stdin.close()

试试这个,看看有没有什么不同。还要确保command是一个字符串而不是一个list/tople,shell=True无论出于什么原因,它都能更好地工作,或者只与字符串一起使用。 还要注意,shell=True会因为不安全等原因而被吊死

同时跳过.communicate()你需要关闭stdout,否则缓冲区将满,你可能会同时挂起你的进程和子进程。在


如果这不起作用,请提供更多信息。例如使用的命令和预期输出(至少前几行)

相关问题 更多 >