Runtime.getRuntime()。execがデフォルトのPythonのバージョンを見つけることができません。

FiReTiTi:

私が使用していたRuntime.getRuntime().exec簡単なPythonスクリプトを実行するRuntime.getRuntime().exec("python test.py")だけで、いくつかの輸入が含まれていますが、それは私がエラーをトレースし、エラー1で失敗した、と私はいくつかのライブラリが見つからなかったことが判明しました:

Traceback (most recent call last):
File "/Users/firetiti/NetBeans/FiReTiTiLiB/Test.py", line 6, in <module>
from PIL import Image
ImportError: No module named PIL

私は、端末に同じスクリプトを実行すると、すべてが大丈夫でした。だから私は、置き換えpythonのpythonへの絶対パスでRuntime.getRuntime().exec("/somewhere/in/my/computer/python3.6 test.py")、それが働きました。

だから、それはそうRuntime.getRuntime().execのpythonの構成されたバージョンを使用していません。どのように私はそれを修正することができますか?

スティーブンC:

あなたが実行している場合はexec("python test.py")Javaで、解決しようとするpython他のアプリケーションが行うのと同じ方法で実行可能ファイルに。

あなたがUNIX、LinuxやMacのOSXを使用していると仮定すると、シーケンスは、おおよそ次の通りです:

  1. JVMが実行しfork、子プロセスを作成するためのシステムコールを。子プロセスは親(JVM)プロセスの環境変数を継承します。

  2. 子プロセスはそれをコマンド名、引数と環境変数を渡し、EXECシステムコールを実行します。

  3. コマンド名は、実行可能ファイルのコマンドサーチパス上のディレクトリを検索して、パス名に名前を解決するためのシステムコールの試行単純な名前であれば、適切でつまり1は、アクセス許可セットを実行します。

  4. 実行可能ファイルが見つかった場合、それはいずれかの子プロセスにロードされるか、その署名に応じて、スクリプトとして解釈されます。

あなたのケースでは、それが動作していないステップ3です。具体的には、間違ったバージョンの見つかったpython検索パス上に。検索パスは、によって決定されたPATH親のJVMから継承されたとして...環境変数。

あなたは対話型シェル内およびJavaから異なる結果、その最も可能性の高い手段を得るのであれば、彼らは異なっていることをPATH変数を。これは、最初に確認することです。たとえば、Javaアプリケーションでは、何この出力を参照してください。

  System.out.println(System.environ().get("PATH"));

そして最初のことを確認しpython、それは見つけるだろうコマンドは、あなたがしたいことをバージョンです。

可能な解決策:

  • 設定してPATHJVMを起動する前に、適切に
  • 使用ProcessBuilder修正環境と外部コマンドを実行します
  • 以下のための絶対パス名を使用してpythonコマンド。
  • これは、3対のPython 2である場合、のようにコマンド名を与えますpython2python3(一般的なLinuxのパッケージでは、などからリンクされますpython2python3、正しい実行可能に。)

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=385006&siteId=1