2010-11-13 119 views
1

我必须制作两个程序(例如“脚本A”(.py)和“脚本B”(.exe))进行通信。 这两个程序都处于无限循环:脚本A需要写入脚本B的标准输入,然后再读取脚本B的标准输出,然后重新写入。脚本B我无法更改。制作两个脚本进行通信

这两个文件都在我的硬盘上,所以我必须有比网络更好的解决方法。但是,我可以用脚本A编写文件。 这不是课程作业,我正在为游戏编写一个GUI,并且我有几个AI的预编程。 我曾想过管道(python scripta.py | scriptb.exe),但似乎需要脚本A在脚本B执行之前完成。再一次,因为我从来没有用过管道系统,所以我可能错过了一些明显的东西。

我宁愿如果所需的工具是标准库的一部分,但如果它们不是太糟糕。

该解决方案将不得不在Linux和Windows上工作。 你们中的任何一个人都能指引我走向正确的方向吗? 谢谢你的时间。

回答

6

如果您使用子流程模块从“脚本A”中启动“脚本B”,您将能够直接与其stdin和stdout进行交互。例如:

from subprocess import Popen, PIPE 

prog = Popen("scriptA.exe", shell=True, stdin=PIPE, stdout=PIPE) 

prog.stdin.write("This will go to script A\n") 
print prog.stdout.read() 

prog.wait() # Wait for scriptA to finish 

只是要小心,因为调用read将被阻塞,这意味着如果该脚本没有什么可以打印,通话将挂起,直到它。最简单的方法是使用线程。

+0

您应该使用'print prog.communicate('这将转到脚本A')[0]'而不是直接使用prog.stdin和prog.stdout - 读取'subprocess'模块文档警告关于不使用stdin和stdout直接。 – 2010-11-13 11:20:49

+0

@Chris是正确的,如果子进程正在产生大量的输出。 – 2010-11-13 11:22:16

+0

@Zach:“Warning:使用'communicate()'而不是'.stdin.write','.stdout.read'或'.stderr.read'来避免由于任何其他OS管道缓冲区填满而造成的死锁阻止儿童进程。“我会认为最好的做法是永远使用“沟通”;我没有用过大于几百字节的任何东西,但是我使用'communic'并且效果很好 - 你有直接使用'.stdin.write'和'.stdout.read'的原因吗? – 2010-11-13 11:29:25

相关问题