Как мне заставить код сохранять локальные переменные между его процессами на python, как это делает ipython notebook?

#python #jupyter-notebook #pycharm #steam

#python #jupyter-notebook #pycharm #Steam

Вопрос:

Я думаю, что мой титул не совсем понятен… Я создал этот код, который извлекает лучшие телевизионные игры Dota в виде массива этих идентификаторов совпадений и печатает их в конце. STEAM_LGN , STEAM_PSW представляют собой комбинацию логин/ пароль steam.

 from steam.client import SteamClient
from dota2.client import Dota2Client

client = SteamClient()
dota = Dota2Client(client)

@client.on('logged_on')
def start_dota():
    dota.launch()

match_ids = []
@dota.on('top_source_tv_games')
def response(result):
    for match in result.game_list: # games
        match_ids.append(match.match_id)  
    
def request_matches():
    dota.request_top_source_tv_games()

client.cli_login(username=STEAM_LGN, password=STEAM_PSW)

request_matches()
dota.on('top_source_tv_games', response)
print(match_ids)
 

То, с чем у меня возникли проблемы

При использовании Anaconda IPython Notebook -> когда я запускаю ячейку в первый раз -> она возвращает меня

[]

но когда я делаю это во второй раз, он возвращает мне реальные данные, например

[5769568657, 5769554974, 5769555609, 5769572298, 5769543230, 5769561446, 5769562113, 5769552763, 5769550735, 5769563870]

Поэтому каждый раз, когда я играю в своей песочнице ipython notebook ->, я нажимаю Shift Enter дважды и получаю данные.

Но теперь мне нужно перенести этот код в более крупный проект. Так, например, допустим, я сохраняю этот код в dota2.info.py файл и помещаю этот код в другой файл, ссылающийся dota2.info.py :

 import subprocess
import time 

### some code ###

while(True):
    subprocess.call(['python', './dota2info.py'])
    time.sleep(10)
 

И при запуске кода проекта это всегда печатается [] так, как это делалось при запуске первой Shift Enter ячейки в ноутбуке Anaconda ipython.

 []
[] 
[]
...
 

Итак, мой вопрос в том , что мне делать в этой ситуации ? Как я могу решить эту проблему (я не знаю), когда код ValvePython / dota2 кэширует некоторые важные данные в локальных неизвестных мне переменных в ipython notebook?

В идеале я хочу , чтобы код немедленно выдавал мне реальные данные , не имея их [] .

Комментарии:

1. Похоже, проблема с конечной точкой API, которую вы задеваете. Если бы была награда, я был бы готов прочитать документы api, но поскольку у вас есть вложенные клиенты API и вы применяете кучу декораторов методов, для меня это не простое решение. Документы Dota и документы steam

2. @will.cass. wrig эти декораторы не вложены мной. Именно так Valve намеревалась использовать свою библиотеку dota2.readthedocs.io/en/stable (кстати, библиотека dota2api, на которую вы ссылались, кажется, устарела, поэтому я ею не пользовался)

3. извините, я не могу помочь. возможно, поднимите это как проблему в репозитории github, если вы не получите ответа здесь на следующий день или около того dota2 github

Ответ №1:

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

Например, предполагая, что в ячейке повторного запуска было все, кроме импорта, это может быть dota2info.py :

 from steam.client import SteamClient
from dota2.client import Dota2Client
import time

def get_results():
    client = SteamClient()
    dota = Dota2Client(client)

    @client.on('logged_on')
    def start_dota():
        dota.launch()

    match_ids = []
    @dota.on('top_source_tv_games')
    def response(result):
        for match in result.game_list: # games
            match_ids.append(match.match_id)  
        
    def request_matches():
        dota.request_top_source_tv_games()

    client.cli_login(username=STEAM_LGN, password=STEAM_PSW)

    request_matches()
    dota.on('top_source_tv_games', response)
    return match_ids

if __name__ == "__main__":
    results = get_results()
    max_retries = 10
    retries = 0
    while not results and retries < max_retries:
        time.sleep(3)  # wait number of seconds to retry
        results = get_results()
        retries  = 1

    print(results)