我的Django应用程序的目标是作为两个Python程序的GUI。因此,除了登录页面,我还有一个表单,在提交后,将调用tasks.py。
我的tasks.py做什么(概述):
表单中的选项或选项将替换为通过if-else条件传递给第一个程序的参数。
然后这些args将被传递给第一个程序。
之后,它将转到第二个程序。
此程序需要打开Virtualbox,因为它是沙盒应用程序。此外,它包含两个subprocess.popen(),因为它将运行沙箱应用程序然后运行提交脚本。
我还将在分析之前根据其类型添加带有输入的args。由于沙盒应用程序不会自行终止并且只是在Ctrl + C之后停止,所以我在读取stdout和stderr之后使用subprocess.kill(),如果它包含表示已成功处理的字符串。
最后,我将发送一个子进程来关闭Virtualbox。
到目前为止,这是关于我的代码的想法:
@shared_task(name='tasks.process_sample_input')
def process_sample_input(instance_id):
try:
vm_open = subprocess.Popen(["VBoxManage", "startvm", "WindowsXP", "--type", "headless"])
args = list()
args = fill_args(instance_id) #this contains the if conditions for the additional arguments
#some codes here for the thug_logs as log files
first_process = subprocess.call((args), stdout=thug_logs, stderr = thug_logs)
if first_process == 0:
second_program(instance_id)
#this contains the subprocess.Popen for the 2nd program, also contains the subprocess.kill() for its subprocesses
if vm_open is None: #If vm_open is still running
subprocess.call(["vboxmanage", "controlvm", "CSG_Win", "poweroff"]) #turn it off
vm_open.kill() #kill the popen command
except:
logger.error("Problem in Celery tasks")
return None
我的问题和疑问:
我的任务只是运行Virtualbox的开放,它不处理第一个程序中的输入。第一个程序的数据库没有变化,因此没有收到输入。 (主要问题,实际上没有进入第二个子流程)
我刚刚选择了使用subprocess.call和subprocess.popen的部分。对于那些可能不会自动关闭的部分,我发送了kill()信号来终止它们。
我只是在一个任务方法中调用所有这些方法,或者子进程命令是否在不同的任务方法中,这样可以吗?这是我的tasks.py中唯一的任务,其他任务都是Python方法。
任何建议或帮助将不胜感激! :)