问题描述
我目前正在开发一个 Django 应用程序,它允许用户编写他们的代码并在服务器端编译它,有点像 CodeAcademy、W3Schools 等。
为了实现Java代码的编译和执行,我尝试使用JPype。我目前编写的代码接收输入的Java代码,将其编译成.class文件,然后执行该文件。
我的问题是这个过程只能发生一次。如果输入代码发生更改,则输出始终相同。我假设这是因为代码仍在 JVM 的内存中,因为如果我重新启动服务器,代码将再次正确编译。
以下是我为此过程编写的代码:
def compile_java_code(request):
""" Function for compiling JavaScript code """
untrustedCode = request.GET.get('untrustedCode')
untrustedCode = untrustedCode.lstrip()
username = str(request.user)
className = re.search('class(.*?){',untrustedCode).group(1)
className = className.replace(" ","")
untrustedCode = untrustedCode.replace(className,username)
f = open(("temp/"+username+".java"),"x")
f.write(untrustedCode)
f.close()
classFile = CLASS_DIR + ("\\"+username+".class")
try:
compile_java(CLASS_DIR + ("\\"+username+".java"))
except subprocess.CalledProcessError:
data = {'output': "Syntax error with the input code - Could not compile. Check through your code."}
os.unlink(f.name)
return JsonResponse(data)
except OSError:
data = {'output': "Class Could not be found. Please revert class name to original name."}
os.unlink(f.name)
return JsonResponse(data)
try:
T = jpype.JClass(username)
t = T()
result = t.test()
data = {'output': str(result)}
os.unlink(f.name)
os.remove(CLASS_DIR+"\\"+username+".class")
except Exception as e:
data = {'output': "Error with the input code. Take another look at your code.\n\n" + str(e)}
if(f.name):
os.unlink(f.name)
if(os.path.exists(classFile)):
os.remove(CLASS_DIR+"\\"+username+".class")
return JsonResponse(data)
def compile_java(java_file):
subprocess.check_output(['javac',java_file])
代码首先接收用户输入的代码并将类名替换为他们的用户名。这是为了确保没有两个文件名相同。
然后我将代码保存到一个 .java 文件中,以便在 compile_java()
函数中进行编译。这个函数创建一个 .class 文件,JPype 然后用它来运行 classes 方法。然后返回结果。
正如我之前所说,无论何时运行此代码,第一次执行时返回的任何内容都将继续返回。
我知道 JPype 还不允许您重新启动 JVM,但是有什么方法可以在编译后清除 JVM 的内存吗?
感谢您的帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)