【问题标题】:Making two scripts communicate使两个脚本通信
【发布时间】:2010-11-13 11:12:11
【问题描述】:

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

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

如果需要的工具是标准库的一部分,我更愿意,但如果不是,那就太糟糕了。

该解决方案必须同时适用于 Linux 和 Windows。 你们中的任何人都可以指出我正确的方向吗? 感谢您的宝贵时间。

【问题讨论】:

    标签: python communication


    【解决方案1】:

    如果您使用 subprocess 模块从“脚本 A”中启动“脚本 B”,您将能够直接与其标准输入和标准输出进行交互。例如:

    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 的调用会阻塞,这意味着如果脚本没有要打印的内容,调用将一直挂起,直到它打印。避免这种情况的最简单方法是使用线程。

    【讨论】:

    • 您应该使用print prog.communicate('This will go to script A')[0],而不是直接使用 prog.stdin 和 prog.stdout - 阅读subprocess 模块文档警告关于不直接使用 stdin 和 stdout。
    • @Chris 是正确的,如果子进程正在生成大量输出。
    • @Zach: "警告:使用communicate() 而不是.stdin.write.stdout.read.stderr.read 以避免由于任何其他操作系统管道缓冲区填满并阻塞子进程而导致的死锁。”我会认为绝对始终使用communicate 是最佳做法;我没有将它用于大于几百字节的任何内容,但我使用 communicate 并且效果很好 - 你有理由直接使用 .stdin.write.stdout.read 吗?
    • @Chris - 仅当您需要在流式传输数据时访问数据,而不是在 EOF。请注意,RAM 中的通信缓冲区,这意味着如果程序的输出很大,它可能会触发 OOM 杀手或强制过度交换。不过总的来说,我同意你的看法,这是我的疏忽。
    • @Zach:好的,感谢您的澄清,很高兴了解更多信息 :-)
    【解决方案2】:

    您可能有兴趣查看Interprocess Communication and Networking

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 2013-04-19
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多