1

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

每次调用这个外部 exe 时,它​​都会返回一个不同的字符串。但是,如果我使用 Popen 多次调用它,它总是会返回 SAME string。=:-O

看起来 Popen 总是从标准输出返回相同的值,而无需调用 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

4 回答 4

3

有可能(如果C_KEY_MAKER的随机行为基于以秒为单位的当前时间,或类似的)当您在命令行上运行两次时,两次运行之间的时间发生了变化,因此您得到不同的输出,但是当 python运行它,它连续运行两次,时间没有改变,所以它连续两次返回相同的值。

于 2009-07-14T11:08:41.660 回答
1

没有。在我自己的测试中,这很好用(除了底部的缩进错误)。问题出在您的 exe 中。或其他地方。

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

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

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

于 2009-04-04T13:59:45.243 回答
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
于 2009-04-04T23:38:53.090 回答
0

您的代码不能按原样执行,因此很难为您提供太多帮助。考虑修复缩进和语法并使其独立,以便我们尝试一下。

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

于 2009-04-04T14:10:51.550 回答