java - "cannot find the main class"使用 subprocess.Popen 调用 java 程序时出错,而同一个调用只能使用 os.system

标签 java python path external popen

我正在编写一个调用另一个 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/

相关文章:

java - 将上传的文件保存在磁盘、ubuntu 路径上

java - 不存在类型变量 V 的实例,因此 ExpectedCondition<Boolean> 符合 Function<? super WebDriver,V> 使用 Selenium 3.13.0 时出错

java - 更改位于 Visual Studio 中不同位置的 SDK 的路径

python - Python 中的动词时态转换

java - 在云数据库上使用 Apache Beam 更改文件元数据?

wpf - 路径的笔画厚度不变,与比例无关

java - 尽管文件存在,但 FileNotFoundException

java - 这两种初始化字符串的方式有什么区别?

java - 如何使用stripes框架安全地实现 "remember me in this computer"?

Python:以 double 翻转一个精确位