我正在编写一个调用另一个java程序的脚本来执行某些任务。当且仅当前一个任务完成时,每个任务开始是非常重要的。每个任务可能会运行几天,产生大量输出。它适用于庞大的数据库
我注意到如果我使用os.system()运行脚本,它会运行第一个任务几分钟,然后由于某种原因启动第二个任务,尽管第一个任务没有完成。第一项任务通常没有结束,就像突然停止工作一样。如果我在较小的数据库上尝试它,只需几分钟即可处理,一切正常。
我不明白为什么它会这样!
出于这个原因,我试图使用Popen(),所以我可以使用communic()来等待,直到被调用的进程结束。
由于某种原因,调用外部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,否则无法找到该文件。
答案 0 :(得分:3)
不确定这是否是一个拼写错误,但在你所描述的“不起作用”的方式中,你在cmd和连接的“1”,“2”和“3”字符串之间没有空格。使用os.system调用,您可以拥有空间。没有空间,您实际上正在更改要执行其主要方法的类的名称,因此您会报告错误。