2017-04-10 19 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から実行するか、ターミナルから実行しますか?
が欠けている端末環境には何がありますか?

すべての洞察力や方向性は私のプロジェクトを始めるでしょう!

+1

どうすればいいですか?私は実際の文字エンコード値またはASCII値を入れなければならないのですか? @ user2357112 –

+2

代わりに ''*''を試してください。shell = Trueを設定しないとうまくいくはずです –

+1

答えとしてコメントを受け入れるにはどうしたらいいですか? @ Jean-FrançoisFabre、あなたの提案が働いた。私は単に答えを書くべきですか? –

答えて

1

端末に"*"と入力すると、*を「現在のフォルダのすべての内容」に展開しないように指示し、Windowsでは特に何もしません(二重引用符はスペースから保護するのに便利です)。どちらの場合も、*がjavaコマンドラインに渡されます。

しかしとしてsubprocessに渡されたときlist(文字列を渡すとき、それは違う、と私はそれを行うことはお勧めしません)ので、それは同じではありません_literally "*"などのJavaに渡され、\"*\"(BTWバックスラッシュは必要ありませんが) *

を渡すように、あなたはちょうどこのよう*にその引数を変更する必要があります。

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

コメントで述べたように、"*"が直接argvの一部として渡さとなっていますグロブとして評価されません。これは、subprocess.call()がシェルを呼び出さないためです。むしろ、exec()システムコールを直接呼び出します。

次のいずれかによってこの問題を解決できます。

  1. は、シェルを指定します。それは"java"の前の最初の引数でなければなりません。
  2. call()shell=True引数を含めます。
  3. クラスパスエントリを明示的にargvに追加します。

一般的には、あなたが選ぶことができますが、これはJavaであるため、おそらく#3が最適です。 Javaはクラスパスのワイルドカードをどのように処理するのかちょっと変わっていて、オペレーティングシステムによって異なります。クラスパスでワイルドカードを避けると、私の経験上、頭痛が軽減されます。 Setting multiple jars in java classpath

関連する問題