使用subprocess.Popen调用Java程序时出现"无法找到主类"错误,而使用os.system调用则正常。
我正在写一个脚本,这个脚本会调用另一个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的调用时,是有空格的。没有空格的话,你实际上是在改变你想要执行的类的名字,所以就会出现你报告的错误。