#python #python-3.x #variables #nameerror
#python #python-3.x #переменные #ошибка имени
Вопрос:
Я пытаюсь написать скрипт для записи движения игрока в Rocket League с использованием платформы RLBot. У меня очень минимальный опыт работы с кодом, и я получаю ошибку:
Traceback (most recent call last):
File "c:/Users/Julian/AppData/Local/RLBotGUIX/RLBotPackDeletable/RLBotPack-master/RLBotPack/CustomMutators/playerRecorder.py", line 27, in <module>
class playerRecorder(BaseScript):
File "c:/Users/Julian/AppData/Local/RLBotGUIX/RLBotPackDeletable/RLBotPack-master/RLBotPack/CustomMutators/playerRecorder.py", line 45, in playerRecorder
for car in packet.game_cars:
NameError: name 'packet' is not defined
Пакет определен внутри def run(self):
, но я все еще получаю сообщение об ошибке из-за того, что он не определен. Ниже приведен мой полный сценарий из VS Code. Приветствуется любая помощь.
from typing import Optional
from rlbot.agents.base_agent import BaseAgent, GameTickPacket, SimpleControllerState
import os
import time
import math
from rlbot.agents.base_agent import BaseAgent, SimpleControllerState
from rlbot.utils.structures.game_data_struct import GameTickPacket
from rlbot.utils.game_state_util import GameState, BallState, CarState, Physics, Vector3 as vector3, Rotator
import random
from rlbot.agents.base_script import BaseScript
from rlbot.utils.game_state_util import GameState
DIRECTORY_LOCATION = "C:LogsRecorderlog"
randNum = random.randint(0,9999999999)
# Extending the BaseScript class is purely optional. It's just convenient / abstracts you away from
# some strange classes like GameInterface
class playerRecorder(BaseScript):
def __init__(self):
super().__init__("playerRecorder")
packet = self.get_game_tick_packet()
self.writeFile = open(DIRECTORY_LOCATION "\" "HumanLog" str(car.team) "-" str(randNum), "w")
def run(self):
while True:
packet = self.get_game_tick_packet()
get_output(packet)
sleep(1 / 3)
print("test")
for car in packet.game_cars:
if not car.is_bot:
team = car.team
index = car.index
break
def get_output(self, game_tick_packet):
#***************************************************************
packet = self.get_game_tick_packet()
goodTeam = str(car.team)
goodLoc = packet.game_cars[car.index].physics.location
goodLocX = str(goodLoc.x)
goodLocY = str(goodLoc.y)
goodLocZ = str(goodLoc.z)
goodRot = packet.game_cars[car.index].physics.rotation
goodRotP = str(goodRot.pitch)
goodRotY = str(goodRot.yaw)
goodRotR = str(goodRot.roll)
goodVel = packet.game_cars[car.index].physics.velocity
goodVelX = str(goodVel.x)
goodVelY = str(goodVel.y)
goodVelZ = str(goodVel.z)
goodAngVel = packet.game_cars[car.index].physics.angular_velocity
goodAngVelX = str(goodAngVel.x)
goodAngVelY = str(goodAngVel.y)
goodAngVelZ = str(goodAngVel.z)
hasWC = str(packet.game_cars[car.index].has_wheel_contact)
isSS = str(packet.game_cars[car.index].is_super_sonic)
jumped = str(packet.game_cars[car.index].jumped)
dJumped = str(packet.game_cars[car.index].double_jumped)
bst = str(packet.game_cars[car.index].boost)
ballLoc = packet.game_ball.physics.location
ballLocX = str(ballLoc.x)
ballLocY = str(ballLoc.y)
ballLocZ = str(ballLoc.z)
ballVel = packet.game_ball.physics.velocity
ballVelX = str(ballVel.x)
ballVelY = str(ballVel.y)
ballVelZ = str(ballVel.z)
self.writeFile.write(goodTeam ";"
goodLocX "," goodLocY "," goodLocZ ";"
goodRotP "," goodRotY "," goodRotR ";"
goodVelX "," goodVelY "," goodVelZ ";"
goodAngVelX "," goodAngVelY "," goodAngVelZ ";"
hasWC ";" isSS ";" jumped ";" dJumped ";" bst ";"
ballLocX "," ballLocY "," ballLocZ ";"
ballVelX "," ballVelY "," ballVelZ)
self.writeFile.write("n")
## WRITE OPPONENT
badIndex = -1
for i in range(len(packet.game_cars)):
if i != car.index:
badIndex = i
break
assert badIndex != car.index
assert badIndex != -1
badTeam = str(packet.game_cars[badIndex].team)
badLoc = packet.game_cars[badIndex].physics.location
badLocX = str(badLoc.x)
badLocY = str(badLoc.y)
badLocZ = str(badLoc.z)
badRot = packet.game_cars[badIndex].physics.rotation
badRotP = str(badRot.pitch)
badRotY = str(badRot.yaw)
badRotR = str(badRot.roll)
badVel = packet.game_cars[badIndex].physics.velocity
badVelX = str(badVel.x)
badVelY = str(badVel.y)
badVelZ = str(badVel.z)
badAngVel = packet.game_cars[badIndex].physics.angular_velocity
badAngVelX = str(badAngVel.x)
badAngVelY = str(badAngVel.y)
badAngVelZ = str(badAngVel.z)
badhasWC = str(packet.game_cars[badIndex].has_wheel_contact)
badisSS = str(packet.game_cars[badIndex].is_super_sonic)
badjumped = str(packet.game_cars[badIndex].jumped)
baddJumped = str(packet.game_cars[badIndex].double_jumped)
badbst = str(packet.game_cars[badIndex].boost)
self.writeFile.write(badTeam ";"
badLocX "," badLocY "," badLocZ ";"
badRotP "," badRotY "," badRotR ";"
badVelX "," badVelY "," badVelZ ";"
badAngVelX "," badAngVelY "," badAngVelZ ";"
badhasWC ";" badisSS ";" badjumped ";" baddJumped ";" badbst)
self.writeFile.write("n")
## WRITE ACTION
self.writeFile.write(str(action.throttle) ";" str(action.steer) ";" str(action.pitch) ";" str(action.yaw) ";" str(action.action.roll) ";" str(action.jump) ";" str(action.boost))
self.writeFile.write("n")
##*****************************************************
return action
Комментарии:
1. Если
packet
определено вrun
, оно существует только вrun
. Вам нужно будет сделать его глобальным или передать его каждой функции, которая нуждается в нем в качестве аргумента (лучший вариант).2. Я изменил его, чтобы определять пакет в каждой функции внутри класса, все еще получая
NameError: name 'packet' is not defined
, какие-либо идеи?3. Это фактический отступ вашего кода? В области видимости класса есть lone
for car in packet.game_cars:
, который, вероятно, должен быть частьюdef run
вместо этого. Видя, какpacket
используется в нескольких местах, пожалуйста, укажите полную обратную трассировку ошибки.4. Полная обратная трассировка выглядит следующим образом
Traceback (most recent call last): File "c:/Users/Julian/AppData/Local/RLBotGUIX/RLBotPackDeletable/RLBotPack-master/RLBotPack/CustomMutators/playerRecorder.py", line 27, in <module> class playerRecorder(BaseScript): File "c:/Users/Julian/AppData/Local/RLBotGUIX/RLBotPackDeletable/RLBotPack-master/RLBotPack/CustomMutators/playerRecorder.py", line 45, in playerRecorder for car in packet.game_cars: NameError: name 'packet' is not defined
5. Похоже, что @MisterMiyagi прав: это проблема с отступом в
for car in packet.game_cars:
строке. Возможно, это должно быть вrun
методе (или даже вwhile
циклеrun
метода). На данный момент этот фрагмент кода выполняется в глобальной области, гдеpacket
не определен.
Ответ №1:
В функции run(…) вы должны ввести self.get_output(packet)
вместо get_output()
. Вы должны передать пакет в качестве параметра функции, а также вы должны написать self перед именем функции, потому что оно находится внутри класса. Я думаю, что вы также неправильно указали параметр функции get_output, потому что вы назвали его game_tick_packet, а в функции вы используете переменную с именем просто packet.
Комментарии:
1. В
self
области действияfor car in packet.game_cars:
цикла нет.