環境として、SL4A + Python for Androidです。共にgithubのkuri65536さんがforkされているものです。
最新の2.7系を使いたいため、QPythonは選択肢から除外しました。
手動でSL4AとPython for Androidをインストールしたあと、SL4Aに格納されているサンプルファイルを実行できることを確認しました。
そもそもAndroid JavaからPythonを呼び出して結果を読み取るにはどうすれば良いか、テストプロで検証しています。
以下、テストプロです。
ProcessBuilderでPythonを実行し、実行結果をStreamReaderで吸い出してログに吐いています。
実行しているsay_hello.pyは 以下です。
lang
1print 'hello'
--
検証直後は、環境変数が足りないエラーが出力されていたので、
SL4Aのサンプル.pyファイルを実行した時に流れていたlogcatの内容を環境変数に追加しています。
Java
1public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 doPython(); 9 10 } 11 12 private void doPython() { 13 14 String TAG = "xx"; 15 ProcessBuilder pb = new ProcessBuilder( 16 "/data/user/0/com.googlecode.pythonforandroid/files/python/bin/python", 17 "/storage/emulated/0/sl4a/scripts/say_hello.py" 18 ); 19 20 try{ 21 pb.redirectErrorStream(true); // 標準出力と標準エラーの出力先をマージする 22 Map<String, String> envs = pb.environment(); 23 envs.put("LD_LIBRARY_PATH", "/data/user/0/com.googlecode.pythonforandroid/files/python/lib"); 24 envs.put("PYTHONHOME", "/data/user/0/com.googlecode.pythonforandroid/files/python"); 25 envs.put("TEMP", "/storage/emulated/0/com.googlecode.pythonforandroid/extras/python/tmp"); 26 envs.put("PYTHONPATH", "/storage/emulated/0/sl4a/scripts:/storage/emulated/0/com.googlecode.pythonforandroid/extras/python:/data/user/0/com.googlecode.pythonforandroid/files/python/lib:/data/user/0/com.googlecode.pythonforandroid/files/python/lib/python2.7/site-packages:/data/user/0/com.googlecode.pythonforandroid/files/python/lib/python2.7/lib-dynload"); 27 envs.put("PYTHON_EGG_CACHE", "/data/user/0/com.googlecode.pythonforandroid/files/python/lib/python2.7/lib-dynload"); 28 envs.put("PATH", "$PYTHONHOME:$PATH"); 29 30 Process p = pb.start(); 31 int ret = p.waitFor(); 32 Log.d(TAG, "python起動結果: " + ret); 33 34 String line = null; 35 StringBuffer retOut = new StringBuffer(); 36 37 BufferedReader reader = new BufferedReader( 38 new InputStreamReader(p.getInputStream())); 39 while ((line = reader.readLine()) != null) { 40 retOut.append(line + "\n"); 41 } 42 43 Log.d(TAG, "python 出力結果"); 44 Log.d(TAG, retOut.toString()); 45 46 reader.close(); 47 }catch (IOException e){ 48 Log.e(TAG, "Error occured in invoking process."); 49 }catch (InterruptedException e){ 50 Log.e(TAG, "Error occured in waiting process."); 51 } 52 } 53} 54
--
実行した時のlogcatは以下の通りです。
python起動結果:1
python 出力結果
ImportError: No module named site
Android上でSL4AとPython for Androidを使って、JavaからPythonを実行された方が居られたら助言頂きたいです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。