私が使用していた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の構成されたバージョンを使用していません。どのように私はそれを修正することができますか?
あなたが実行している場合はexec("python test.py")
Javaで、解決しようとするpython
他のアプリケーションが行うのと同じ方法で実行可能ファイルに。
あなたがUNIX、LinuxやMacのOSXを使用していると仮定すると、シーケンスは、おおよそ次の通りです:
JVMが実行し
fork
、子プロセスを作成するためのシステムコールを。子プロセスは親(JVM)プロセスの環境変数を継承します。子プロセスはそれをコマンド名、引数と環境変数を渡し、EXECシステムコールを実行します。
コマンド名は、実行可能ファイルのコマンドサーチパス上のディレクトリを検索して、パス名に名前を解決するためのシステムコールの試行単純な名前であれば、適切でつまり1は、アクセス許可セットを実行します。
実行可能ファイルが見つかった場合、それはいずれかの子プロセスにロードされるか、その署名に応じて、スクリプトとして解釈されます。
あなたのケースでは、それが動作していないステップ3です。具体的には、間違ったバージョンの見つかったpython
検索パス上に。検索パスは、によって決定されたPATH
親のJVMから継承されたとして...環境変数。
あなたは対話型シェル内およびJavaから異なる結果、その最も可能性の高い手段を得るのであれば、彼らは異なっていることをPATH
変数を。これは、最初に確認することです。たとえば、Javaアプリケーションでは、何この出力を参照してください。
System.out.println(System.environ().get("PATH"));
そして最初のことを確認しpython
、それは見つけるだろうコマンドは、あなたがしたいことをバージョンです。
可能な解決策:
- 設定して
PATH
JVMを起動する前に、適切に - 使用
ProcessBuilder
修正環境と外部コマンドを実行します - 以下のための絶対パス名を使用して
python
コマンド。 - これは、3対のPython 2である場合、のようにコマンド名を与えます
python2
かpython3
。(一般的なLinuxのパッケージでは、などからリンクされますpython2
とpython3
、正しい実行可能に。)