Python的subprocess.Popen返回相同的标准输出,即使它不应该

时间:2009-04-04 13:49:47

标签: python subprocess stdout popen

我的Python subprocess.Popen有一个非常奇怪的问题。我用它来调用外部exe几次并将输出保存在列表中。

每次调用此外部exe时,它都会返回不同的字符串。但是,如果我使用Popen多次调用它,它将始终返回相同的字符串。 =: - O

看起来Popen总是从stdout返回相同的值,而没有回忆exe。也许做某种缓存而不再实际调用exe。

这是我的代码:

def get_key():

    from subprocess import Popen, PIPE

    args = [C_KEY_MAKER, '/26', USER_NAME, ENCRYPTION_TEMPLATE, '0', ]
    process = Popen(args, stdout=PIPE)
    output = process.communicate()[0].strip()
    return output

if __name__ == '__main__':
    print get_key() # Returns a certain string
    print get_key() # Should return another string, but returns the same!

地球上我做错了什么?!

4 个答案:

答案 0 :(得分:3)

有可能(如果C_KEY_MAKER的随机行为基于当前时间(以秒为单位)或类似情况),当您在命令行上运行两次时,运行之间的时间已经改变,所以你得到一个不同的输出,但是当python运行它时,它会快速连续运行两次,时间没有改变,所以它连续两次返回相同的值。

答案 1 :(得分:1)

无。这在我自己的测试中工作正常(除了底部的缩进错误)。问题出在你的exe上。或其他地方。

为了澄清,我创建了一个python程序tfile.py

cat > tfile.py
#!/usr/bin/env python
import random
print random.random()

然后改变程序以消除底部的缩进问题,并调用tfile.py。它确实给出了两个不同的结果。

答案 2 :(得分:1)

我不知道你的例子出了什么问题,我无法复制这种行为,但是尝试更多的书本方法:

def get_key():

    from subprocess import Popen, PIPE

    args = [C_KEY_MAKER, '/26', USER_NAME, ENCRYPTION_TEMPLATE, '0', ]
    output = Popen(args, stdout=PIPE).stdout
    data = output.read().strip()
    output.close()
    return data

答案 3 :(得分:0)

您的代码不可执行,因此很难帮助您。考虑修复缩进和语法并使其自包含,以便我们可以试一试。

在Linux上,根据Devin Jeanpierre的说法,似乎工作正常。