我正在编写一个调用另一个 java 程序的脚本,以执行一些任务。当且仅当前一个任务已经完成时,每个任务才开始是非常重要的。每个任务可能会运行几天,产生大量的输出。它适用于庞大的数据库
我注意到,如果我使用 os.system() 运行脚本,它会在第一个任务中运行几分钟,然后由于某种原因启动第二个任务,尽管第一个任务尚未完成。第一个任务没有正常结束,就像它突然停止工作一样。如果我在只需要几分钟处理的较小数据库上尝试它,一切正常。
我不明白为什么它会这样!
出于这个原因,我尝试使用 Popen(),这样我就可以使用 communicate() 来等待调用的进程结束。
出于某种原因,调用外部 java 程序的同一命令适用于 os.system(),但它表示无法使用 Popen() 找到 main()。我使用的是相对路径,我也尝试过绝对路径但没有成功。
是否有 Popen() 的替代方法?但是,我不明白为什么它找不到主类。调用外部程序时 os.system() 和 Popen() 到底有什么区别?我该如何解决或解决我的问题?
代码如下:
import os
from subprocess import Popen
def doWork():
owd = os.getcwd()
cmd = "java -Dfile.encoding=Cp1252 -classpath \"bin;lib\\mysql-connector-java-5.0.8-bin.jar;lib\\sqlitejdbc-v056.jar\" core.ODBManager"
os.chdir("ODBManager")
#this way does not work
p = Popen(cmd + "1", shell=True) #import
p.communicate() #now wait
p = Popen(cmd + "2", shell=True) #convert
p.communicate() #now wait
p = Popen(cmd + "3", shell=True) #export
p.communicate() #now wait
#this way works but does not wait the command to finish
#before starting another one
# os.system(cmd+" 1") #import
# os.system(cmd+" 2") #convert
# os.system(cmd+" 3") #export
os.chdir(owd)
谢谢。如果有什么不清楚的,请随时询问。 附言java 程序(使用 eclipse 构建)在一个子文件夹中,它从另一个子文件夹中的文件读取一些输入,所以我不得不使用 chdir,否则找不到该文件。
最佳答案
不确定这是否是错字,但按照您描述的“不起作用”的方式,您在 cmd 和连接的“1”、“2”和“3”字符串之间没有空格。通过 os.system 调用,您确实有空间。如果没有空格,您实际上是在更改要执行其主要方法的类的名称,因此您会收到错误报告。
关于java - "cannot find the main class"使用 subprocess.Popen 调用 java 程序时出错,而同一个调用只能使用 os.system,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7234769/