1. # -*- coding: utf-8 -*-
  2. import os,sys,subprocess,tempfile,time
  3. # 创建临时文件夹,返回临时文件夹路径
  4. TempFile = tempfile.mkdtemp(suffix='_test', prefix='python_')
  5. # 文件名
  6. FileNum = int(time.time()*1000)
  7. # python编译器位置
  8. EXEC = sys.executable
  9. #获取python版本
  10. def get_version():
  11. v = sys.version_info
  12. version = "python %s.%s" %(v.major,v.minor)
  13. return version
  14. # 获得py文件名
  15. def get_pyname():
  16. global FileNum
  17. return 'test_%d' % FileNum
  18. # 接收代码写入文件
  19. def write_file(pyname, code):
  20. fpath = os.path.join(TempFile, '%s.py' % pyname)
  21. with open(fpath, 'w', encoding='utf-8') as f:
  22. f.write(code)
  23. print('file path: %s' % fpath)
  24. return fpath
  25. # 编码
  26. def decode(s):
  27. try:
  28. return s.decode('utf-8')
  29. except UnicodeDecodeError:
  30. return s.decode('gbk')
  31. # 主执行函数
  32. def main(code):
  33. r = dict()
  34. r["version"] = get_version()
  35. pyname = get_pyname()
  36. fpath = write_file(pyname, code)
  37. try:
  38. # subprocess.check_output 是 父进程等待子进程完成,返回子进程向标准输出的输出结果
  39. # stderr是标准输出的类型
  40. outdata = decode(subprocess.check_output([EXEC, fpath], stderr=subprocess.STDOUT, timeout=5))
  41. except subprocess.CalledProcessError as e:
  42. # e.output是错误信息标准输出
  43. # 错误返回的数据
  44. r["code"] = 'Error'
  45. r["output"] = decode(e.output)
  46. return r
  47. else:
  48. # 成功返回的数据
  49. r['output'] = outdata
  50. r["code"]="Success"
  51. return r
  52. finally:
  53. # 删除文件(其实不用删除临时文件会自动删除)
  54. try:
  55. os.remove(fpath)
  56. except Exception as e:
  57. exit(1)
  58. # if __name__ == '__main__':
  59. # code ="""print("你好")"""
  60. # print(main(code))

Python exec关键字

  1. def exec_func(func: str) -> str:
  2. """执行函数(exec可以执行Python代码)
  3. :params func 字符的形式调用函数
  4. : return 返回的将是个str类型的结果
  5. """
  6. # 得到一个局部的变量字典,来修正exec函数中的变量,在其他函数内部使用不到的问题
  7. loc = locals()
  8. exec(f"result = {func}")
  9. return str(loc['result'])