#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)