使用subprocess.Popen调用Java程序时出现"无法找到主类"错误,而使用os.system调用则正常。

3 投票
1 回答
1033 浏览
提问于 2025-04-17 00:33

我正在写一个脚本,这个脚本会调用另一个Java程序来执行一些任务。每个任务的开始时间非常重要,必须等前一个任务完成后才能开始下一个任务。因为每个任务可能会运行好几天,输出的数据量也很大,而且它是在一个巨大的数据库上运行的。

我发现如果我用os.system()来运行这个脚本,第一项任务会运行几分钟,然后出于某种原因,它会开始第二项任务,尽管第一项任务还没有完成。第一项任务并没有正常结束,感觉就像突然停止了一样。如果我在一个较小的数据库上运行,这个数据库处理只需要几分钟,所有的事情就都正常了。

我不明白为什么会这样!

因此,我尝试使用Popen(),这样我可以使用communicate()来确保等到调用的进程结束。

但出于某种原因,用os.system()调用外部Java程序的同一命令可以正常工作,而用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,否则找不到那个文件。

1 个回答

3

不太确定这是不是个打字错误,但根据你描述的“那样不行”,在命令和连接的“1”、“2”、“3”字符串之间没有空格。而在你使用os.system的调用时,是有空格的。没有空格的话,你实际上是在改变你想要执行的类的名字,所以就会出现你报告的错误。

撰写回答