让我先谈谈我真正想做的事情。我们需要一个独立于平台的启动脚本来调用具有一些系统属性和动态生成的类路径的JVM。我们特别选择了Jython,因为我们只需要在启动脚本中依赖独立的jython.jar。我们决定编写一个使用subprocess.Popen启动应用程序的jvm然后终止的jython脚本。
还有一件事。我们的应用程序使用许多传统的调试代码打印到标准输出。因此,启动脚本通常将stdout / stderr重定向到日志文件。我试图用我们的jython脚本重现它:
subprocess.Popen(args,stdout=logFile,stderr=logFile)
在此行之后,启动程序脚本和托管jvm for jython终止。问题是logFile中没有显示任何内容。如果我这样做:
subprocess.Popen(args,stdout=logFile,stderr=logFile).wait()
然后我们得到日志。那么父进程需要与通过子进程启动的应用程序进程并行运行吗?我想避免两个正在运行的jvms。
是否可以以这样的方式调用子进程,即使父进程终止,也会写入stdout文件?有没有更好的方法从jython启动应用程序jvm?无论如何,Jython是一个糟糕的解决方案吗?
答案 0 :(得分:1)
我们需要一个独立于平台的启动脚本来调用具有一些系统属性和动态生成的类路径的JVM。
您可以使用独立于平台的脚本在安装时或每次调用之前生成特定于平台的启动脚本。在后一种情况下,另外,您需要一个简单的静态平台特定脚本,该脚本调用您的平台独立的启动脚本生成脚本,然后调用生成的脚本本身。在这两种情况下,您都可以通过调用静态平台特定脚本来启动应用程序。
是否可以以这样的方式调用子进程,即使父进程终止,也会写入stdout文件?
您可以在子进程中打开文件/重定向,例如,使用shell:
Popen(' '.join(args+['>', 'logFile', '2>&1']), # shell specific cmdline
shell=True) # on Windows see _cmdline2list to understand what is going on