2011-12-16 2 views
0

私が取り組んでいるJavaプロジェクトには.batファイルと.shファイルがあり、プロジェクトの実行にはCLASSPATHが作成されています。 (ウィンドウの場合は.bat、残りの場合は.sh)。Pythonから.batファイルに構築されたCLASSPATHを取得します

私はこれらのスクリプトで作成されたクラスパスにアクセスする必要のあるPythonスクリプトを作成しています.1つは.sh(Linuxの場合)、もう1つは.bat(Windowsの場合)です。

Popen(['bash', '-c', '. mkcp.sh && echo $CLASSPATH'], stdout=sp.PIPE).communicate()[0].strip() 

そして、私はWindows上でこれを行うための同等の方法を把握することはできません。

現在、私は、Linuxのためにこれをやっています。これまでのところ私はこの

check_output(['cmd', '/c', 'call mkcp.bat && echo %CLASSPATH%']) 

を作ってみた。しかし、それは標準出力にmkcp.batファイル内のすべてのコマンドを置きます。 (そのファイルに@echo offを追加することは私の選択肢ではなく、変更できません)。その問題を除いて、主な問題は、がの代わりにバッチファイルが実行されていることです。これは私が望むものではありません。

上記のようにPopenオブジェクトを作成してバッチファイルを実行しても、そのプロセスの環境にアクセスできる場合、私は自分が望むものを得ることができたと考えました。しかし、Popenの文書から、これは可能ではないように見えます。

これを達成するためのアイデアはありますか?

答えて

1

最も簡単な方法は、関連するコマンドを使用してバッチファイルを作成することです。そうすれば、CMDが関連する行を処理するまで、変数は拡張されません。また、エコーを無効にする@echo offを使用します。

@echo off 
call mkcp.bat 
echo %CLASSPATH% 

は、それからちょうどあなたのPythonコードからそのバッチファイルを呼び出します。

あなたが介在バッチファイルトライせずにそれをしたい場合:あなたの代わりに%の置換のため!を使用する場合

check_output(['cmd', '/V:ON', '/c', '"@echo off && call mkcp.bat && echo !CLASSPATH!"']) 

/V:ONは、環境変数の遅延拡張を可能にします。

+0

これは素晴らしいです。私はその結果をあなたに知らせようとします。どちらも非常に良いソリューションのように見えます。あなたは特にお勧めですか? [私は私のインターネットを失ったので早く戻ってこなかった]。 –

+0

好きなものを使います。2番目の方法は外部バッチファイルを必要としないという利点がありますが、より複雑なものにしたい場合はもっと制限されます。複数のvarsを取​​得します。 – Duncan

+0

十分な公正。私は今のところ2番目のものを使用しています。ありがとう、トン男:)。 (そして、私は今Windowsマシンにアクセスできない、最終テストを行い、月曜日にこれを受け入れる)。 :) –

関連する問題