我正在创建一个棋盘游戏,长话短说:我想要一个文件启动并设置游戏的主要变量(玩家名称,棋盘(数组),提示,状态 - 玩/游戏)和导出这些作为.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)
我是如此疯狂地困惑,因为当我第一个单独运行第二个文件后,它完美地工作。
我真的很感激一些帮助,我知道这可能是一些愚蠢的忽视,一个菜鸟真的可以使用一些帮助,非常感谢你。
答案 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
由于文件未关闭,缓冲区不会刷新到磁盘,因此子进程无法读取其内容。
主进程结束后,文件对象在垃圾收集时关闭,缓冲区被刷新到磁盘,所以如果你自己执行第二个脚本,那么它会读取文件内容。