2015-07-10 2 views
0

Я создаю настольную игру и короткую короткую историю: мне нужен файл, который запустит и установит основные переменные игры (имя игрока, доска (массив), подсказка, статус - play/gameover) и экспортировать их как .json-файл. Установленный файл представляет собой большой файл GIU, поэтому я хотел бы запустить основную игру (логику и отображение) в отдельном файле.Передача JSON не работает между процессами

Я занимаюсь этим с помощью простой игры tic-tac-toe, но по какой-то причине я не могу получить json-файл для правильного экспорта/импорта (не могу сказать, какой) ИЛИ не может получить функцию ввода для работы в отдельной функции.

(код очень простой и по-прежнему неполный, но я просто пытаюсь сделать первый шаг для работы - запустите, попросите имя, затем запустите файл с функцией, которая отобразит доску и попросит пользователей следующий шаг)

раствор 1) с использованием subprocess.Popen

file1:

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

'engineANDvisuals.py' содержит только определение функции. – martineau

ответ

1

Короткий ответ: fout.close отсутствует в скобки - вы хотите fout.close() - или лучше использовать with заявление:

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

Более длинный ответ:

Без скобок, fout.close Evals к close методу fout , но этот метод не вызывается:

>>> f = open("foo.txt", "w") 
>>> print f.close 
<built-in method close of file object at 0xf0d660> 

Si nce файл не закрыт, буфер не очищается на диск, поэтому подпроцесс не может прочитать его содержимое.

После завершения основного процесса объект файла закрывается во время сбора мусора, и буфер сбрасывается на диск, поэтому, если вы выполняете второй скрипт на своем собственном, в это время он читает содержимое файла.

+0

отлично! Большое вам спасибо, это работает для os.system образом, глупый взгляд ах! У вас есть идея, почему у меня все еще будут проблемы с подпроцессом.Сейчас не так уж много, потому что у меня есть другая работа, но она все еще кажется, что она застряла на линии ввода, и задавалась вопросом, было ли это чем-то специфичным для ввода отдельного процесса. –

+0

'subprocess' может быть сложным делом - но есть ли причина использовать подпроцесс вообще здесь? –

Смежные вопросы