JSON传输在进程之间不起作用

时间:2015-07-10 15:30:52

标签: python json

我正在创建一个棋盘游戏,长话短说:我想要一个文件启动并设置游戏的主要变量(玩家名称,棋盘(数组),提示,状态 - 玩/游戏)和导出这些作为.json文件。设置文件是一个大的GIU文件,所以我想在一个单独的文件中运行主游戏(逻辑和显示)。

我正在练习使用一个简单的井字游戏,但由于某种原因,我无法正确导出/导入json文件(无法真正告诉哪个)或无法获得输入函数在单独的职能部门工作。

(代码是非常基本的,但仍然不完整,但我只想尝试第一步 - 启动,询问名称,然后使用将显示该板的功能运行该文件,然后向用户请求动)

解决方案1)使用subprocess.Popen

文件1:

import json, subprocess, os
from distlib.compat import raw_input


print('Welcome to TIC-TAC-TOE!')
print()

#Set up of the start information that is going to be passed as JSON payload and sent to each process back and forth
#------------------------------------------------
name = raw_input('Please enter your name: ')
prompt = 'select a space: '
board = [0,1,2,
     3,4,5,
     6,7,8]
move = None
status = 'playing'
winner = None
iter = 0
#------------------------------------------------


#JSON payload {dictionary} to be sent
info = {'name':name, 'prompt':prompt, 'board':board, 'move':move, 'status': status, 'winner': winner, 'iter': iter, }

print('START, info dictionary as it goes out: ', info)



#file out which dumps info the info.json file
fout = open('info.json', 'w')
json.dump(info, fout)
fout.close


subprocess.Popen(["python3", "engineANDvisuals.py"])

文件2)'engineANDvisuals.py'

#imported libraries
import random, funcs as f, json
from distlib.compat import raw_input



#front-end: iterface function
def interface(jsonFile):

   fin = open(jsonFile, 'r')                                                        #open up the     json file to read
   info = json.load(fin)                                                             #load json file as info
   fin.close                                                                        #close the json file

   print('FRONT, info dictionary as it comes IN: ', info)
   print()

   name = info['name']                                                                  #set json-name to name 
   prompt = info['prompt']                                                      #set json-prompt to prompt   
   board = info['board']                                                            #set json-board to board
   winner = info['winner']                                                          #set json-winner to winner
   status = info['status']                                                          #set json-status to status      


   f.printBoard(board)                                                              #prints out the board so that the user can see it
   print(info['move'])
   info['move'] = input(f.returnName(name)+', please '+ f.returnPrompt(prompt))

   print('FRONT, info dictionary as it goes OUT: ', info)

   fout = open(jsonFile, 'w')                                                       #open up the json file to write
   json.dump(info, fout)                                                            #dumps new info into the file   
   fout.close                                                                       #closes the json file

f.functions是位于另一个文件中的简单打印功能。使用这种方法,我一直到第二个文件中的输入行,然后程序停止。它没有终止,我的核心根本没有运行(因此我认为它不在循环中)它只是在程序要求空间后停止。

方法2)现在,如果我使用os.system来打开进程,它会给我一个巨大的错误,我认为这意味着它正在错误地导入/导出json文件。

Traceback (most recent call last):
  File "engineANDvisuals.py", line 105, in <module>
    interface('info.json')
  File "engineANDvisuals.py", line 19, in interface
    info = json.load(fin)                                                                #load json file as info
  File "/usr/lib/python3.4/json/__init__.py", line 268, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.4/json/decoder.py", line 361, in raw_decode
    raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 1 (char 0)

我是如此疯狂地困惑,因为当我第一个单独运行第二个文件后,它完美地工作。

我真的很感激一些帮助,我知道这可能是一些愚蠢的忽视,一个菜鸟真的可以使用一些帮助,非常感谢你。

1 个答案:

答案 0 :(得分:1)

简短回答:fout.close缺少parens - 您想要fout.close() - 或者更好地使用with声明:

with open('info.json', 'w') as fout:
    json.dump(info, fout)

更长的答案:

如果没有parens,fout.close会对close的{​​{1}}方法进行规避,但不会调用该方法:

fout

由于文件未关闭,缓冲区不会刷新到磁盘,因此子进程无法读取其内容。

主进程结束后,文件对象在垃圾收集时关闭,缓冲区被刷新到磁盘,所以如果你自己执行第二个脚本,那么它会读取文件内容。