Python Popen子进程查找字典无法写入或读取(或其他任何内容)

时间:2018-11-06 19:17:09

标签: python dictionary subprocess popen

所以我将这个不和谐的机器人放在一起,该机器人执行命令到服务器来托管一些游戏。

我有一个字典,格式为{'Game Name':subprocess.Popen()}

subprocess_LOOKUP = {}

我们需要存储以便以后注入命令来更改游戏模式等。

我将代码简化为两个小功能,以清楚地显示问题。

import subprocess
from subprocess import PIPE, STDOUT

subprocess_LOOKUP = {}

def gamestart(game, startcmd):

    #Open pipe with all parameters to read, write and communicate
    p = subprocess.Popen(startcmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=PIPE, shell=True)

    subprocess_LOOKUP.update({ game : p }) #Store into dictionary here


def gameinput(game, cmd):

    p = subprocess_LOOKUP[game]     #Retrieve from dictionary

    print(cmd)                      #Prints the command I want to input into the shell
    print(p.stdout.readline())      #Does Nothing (prints no errors)

    p.stdin.write(str.encode(cmd))  #Does Nothing (prints no errors)
    p.communicate()[0]              #Does Nothing (prints no errors)
    p.stdin.close()                 #Does Nothing (prints no errors)

稍后,当我访问字典时,对subprocess.Popen()的引用似乎不存在?尝试写,读或与该进程通信无济于事,也不会打印任何错误!

我通过查看此处的其他类似问题,尝试了多种方法分别从stdin或stdout进行写入或读取,但是仍然没有任何反应。我是否完全错过了某些事情,还是需要做些什么?

1 个答案:

答案 0 :(得分:1)

您的印象是,全局变量在进程之间共享。 It is not。您的选择是:

  1. 使用multiprocessing.Arraymultiprocessing.Value共享状态。
  2. 使用multiprocessing.Manager
  3. 使用某种IPC。

管理器似乎更适合您的问题,因为它允许您使用字典。