2017-04-10 64 views
1

我使用Pythons的subprocess模塊來運行命令。Python用於運行Java JAR,ClassNotFoundException

該命令用於運行java JAR文件

當我運行它通過終端,它運行良好,產生所需的輸出。

JAVA通過終端命令:

java -cp "*" -Xmx2g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,parse,dcoref,depparse -file input/input.txt

我寫了一個簡單的Python腳本來運行相同的命令。

from subprocess import call 
def main(): 
    call(['java', '-cp', '\"*\"','-Xmx2g','edu.stanford.nlp.pipeline.StanfordCoreNLP','-annotators','tokenize,pos,lemma,ner,parse,dcoref,depparse', '-file', 'input/input.txt']) 

終端命令(從我跑了java命令相同的文件夾):這裏

python script.py 

輸出是:

Error: Could not find or load main class  edu.stanford.nlp.pipeline.StanfordCoreNLP 

我的思念,什麼是不一樣當我從python運行它或從終端運行它?
蟒蛇call()錯過了什麼在終端環境?

任何洞察力或方向將啓動我的項目!

+1

然後我該如何處理?我應該放入一個實際的字符編碼值或ASCII值嗎? @ user2357112 –

+2

嘗試使用''*''代替,只要您不設置shell = True –

+1

我應該如何接受評論作爲答案? @ Jean-FrançoisFabre,你的建議奏效了。我應該只是寫一個答案嗎? –

回答

1

在終端中輸入"*"時,它只是告訴Linux不要將*擴展爲「當前文件夾的所有內容」,並且在Windows上不做任何特殊處理(雙引號可有效防止空格)。在這兩種情況下,*都被傳遞給java命令行。

但是,當傳遞到subprocesslist(傳遞字符串時,它的不同,我不建議這樣做),\"*\"(無需反斜槓BTW)傳遞到Java _literally爲"*"所以它是不一樣的如通過*

所以你要這樣的說法只是改變*這樣的:

call(['java', '-cp', '*','-Xmx2g', ... 
1

正如在評論中指出,"*"是直接傳遞的部分argv,是沒有被評估爲glob。這是因爲subprocess.call()不會調用一個shell。相反,它直接調用exec()系統調用。

您可以通過以下任一解決此問題:

  1. 指定外殼。它應該是"java"之前的第一個參數。
  2. call()中包含shell=True參數。
  3. 明確地在argv中添加您的類路徑條目。

對於一般情況,您可以選擇,但因爲這是Java,#3可能是您最好的選擇。 Java對於如何處理類路徑通配符有點奇怪,並且它隨操作系統而變化,根據我的經驗,如果避免在類路徑中使用通配符,那麼頭疼的次數就會減少。請參閱Setting multiple jars in java classpath

相關問題