Python文件处理报错:JSON使用时出现NameError问题求助
解决NameError: name 'jsonstring' is not defined的问题
问题根源
你遇到的错误其实很好理解:receiver.py的运行环境里根本不存在jsonstring这个变量。虽然command.py里确实定义了它,但你只是读取了command.py的文件内容,并没有把这个变量导入到receiver.py的作用域中——fh.read()只是把文件内容转成了一串文本,不会自动执行脚本里的代码,也不会帮你提取变量。
两种可行的解决方案
方案1:通过模块导入获取变量(推荐)
这是最规范的Python写法,把command.py当作一个模块来导入,直接调用它里面的jsonstring变量:
修改receiver.py中从读取文件到解析JSON的代码块:
# 替换原来的fh = open(...)到json.loads的所有代码 import command # 导入同目录下的command.py模块 # 直接使用模块里的jsonstring变量 loaded_r = json.loads(command.jsonstring) if loaded_r['task'] == 'allow': # 建议加上shell=True,同时确保test.sh有执行权限,最好用绝对路径 subprocess.call('./test.sh', shell=True) else: print("not found")
⚠️ 小提示:要确保command.py和receiver.py在同一个目录下,或者在Python的搜索路径范围内。
方案2:执行文件内容并提取变量
如果不想用模块导入,也可以通过exec执行command.py的代码,把变量注入到当前环境中:
修改receiver.py的对应代码块:
fh = open("command.py","r") content = fh.read() fh.close() # 执行command.py的代码,将生成的变量存入local_vars字典 local_vars = {} exec(content, globals(), local_vars) # 从字典中取出我们需要的jsonstring变量 jsonstring = local_vars['jsonstring'] loaded_r = json.loads(jsonstring) if loaded_r['task'] == 'allow': subprocess.call('./test.sh', shell=True) else: print("not found")
⚠️ 注意:exec会执行文件里的所有代码,如果command.py来自不可信来源,这种方式有安全风险,但你的场景是虚拟机之间传输的自有文件,所以完全没问题。
额外注意事项
- 确保
test.sh有执行权限:在VM2中执行chmod +x test.sh给脚本添加可执行权限。 - 如果
test.sh不在当前工作目录,建议使用绝对路径(比如/home/your-user/test.sh),避免路径问题导致脚本找不到。
内容的提问来源于stack exchange,提问作者nugie
相关产品推荐
相关产品推荐

