问题
I've been making a mod for the Raspberry Pi version of Minecraft and I'm getting a very frustrating error every time I enter one of the commands in my program. Here's my code:
import minecraft.minecraft as minecraft
import minecraft.block as block
import time
mc = minecraft.Minecraft.create();
print('newBlock - Change ID of block to spawn')
print('blockType - Change subID of block to spawn')
print('pos1')
print('pos2')
print('fill - fill specified area')
print('clear - clear specified area')
print
while True:
comm=str(input('Command: '))
if comm=="newBlock":
blockId = int(input('Enter Block ID: '))
mc.postToChat('Block set to ID: ' + str(blockId))
if comm=="blockType":
blockData = int(input('Enter Block Type: '))
if comm=="pos1":
position1 = mc.player.getPos()
mc.postToChat('Set Position 1 as: x' + str(position1.x) + ' y' + str(position1.y) + ' z' + str(position1.z))
if comm=="pos2":
position2 = mc.player.getPos()
mc.postToChat('Set Position 2 as: x' + str(position2.x) + ' y' + str(position2.y) + ' z' + str(position2.z))
if comm=="fill":
mc.setBlocks(position1.x, position1.y, position1.z, position2.x, position2.y, position2.z, blockId, blockType)
mc.postToChat('Filled specified area with: ' + str(blockId))
if comm=="clear":
mc.setBlocks(position1.x, position1.y, position1.z, position2.x, position2.y, position2.z, 0)
mc.postToChat('Cleared specified area')
Everytime the input is entered by the user through the variable 'comm' the program spits out this error message:
Traceback (most recent call last):
File "WorldEditPi.py", line 15, in <module>
comm=str(input('Command: '))
File "<string>", line 1, in <module>
NameError: name 'newBlock(or what ever the user entered into 'comm')' is not defined
Whats really confusing is that it's not even talking about a variable 'newBlock' is not a variable, it is the contents of the variable 'comm'. This occurs with all commands, not just 'newBlock'.
回答1:
You're using input
where you need to be using raw_input
. input
evaluates the string that it's passed. raw_input
gives you a string, which is what you want.
Note that this only applies in Python 2. In Python 3, raw_input
is no longer available and input
is the equivalent of Python 2's raw_input
. In Python 2, input
is equivalent to eval(raw_input)
回答2:
when you use the input() to input the newBlock , the parser regards the newBlock as the variable instead of string. so you need to use raw_input
see the ref of the input()
def input(prompt):
return (eval(raw_input(prompt)))
来源:https://stackoverflow.com/questions/16258974/python-nameerror-from-contents-of-a-variable