質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

2857閲覧

Android5.0.1でJavaからPython(SL4A)を実行したい

hayash-dev

総合スコア50

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2017/02/20 12:35

編集2017/02/24 06:39

環境として、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を実行された方が居られたら助言頂きたいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

結論から言うと諦めました

以下、確認手順です。


1.PCのコマンドから > adb shell
2.shellが起動したら $run-as (パッケージ名)
3.$setで環境変数確認
4.以下を実行して環境変数を整える

shell

1LD_LIBRARY_PATH=/data/user/0/com.googlecode.pythonforandroid/files/python/lib 2export LD_LIBRARY_PATH 3PYTHONHOME=/data/user/0/com.googlecode.pythonforandroid/files/python 4export PYTHONHOME 5TEMP=$TEMP:/storage/emulated/0/com.googlecode.pythonforandroid/extras/python/tmp 6export TEMP 7PYTHONPATH=/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 8export PYTHONPATH 9PYTHON_EGG_CACHE=/data/user/0/com.googlecode.pythonforandroid/files/python/lib/python2.7/lib-dynload 10export PYTHON_EGG_CACHE 11PATH=$PATH:$PYTHONHOME:$PYTHONPATH:$LD_LIBRARY_PATH 12export PATH 13

5.Pythonを実行

shell

1$/data/user/0/com.googlecode.pythonforandroid/files/python/bin/python /storage/emulated/0/sl4a/scripts/say_hello.py

コンソールに出力されたのが、

/system/bin/sh: /data/user/0/com.googlecode.pythonforandroid/files/python/bin/python: can't execute: Permission denied

ちなみに、pythonのロードモジュール見ると、otherの実行権がついているけど動きませんでした。

shell@Nexus:/data/user/0/com.googlecode.pythonforandroid/files $ ll drwxr-xr-x u0_a92 u0_a92 2017-02-17 16:08 python shell@Nexus:/data/user/0/com.googlecode.pythonforandroid/files $ cd python shell@Nexus:/data/user/0/com.googlecode.pythonforandroid/files/python $ ll drwxr-xr-x u0_a92 u0_a92 2017-02-17 16:08 bin drwxr-xr-x u0_a92 u0_a92 2017-02-17 16:08 lib drwxr-xr-x u0_a92 u0_a92 2017-02-17 16:08 share shell@Nexus:/data/user/0/com.googlecode.pythonforandroid/files/python $cd bin shell@Nexus:/data/user/0/com.googlecode.pythonforandroid/files/python/bin $ll -rwxr-xr-x u0_a92 u0_a92 13468 2017-02-17 16:08 python

投稿2017/02/24 06:36

hayash-dev

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問