You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:32:30