2010-12-31 3 views
3

Я пытаюсь запустить подпроцесс на Android (см. this question), который требует установки переменной окружения PYTHONHOME. Я пытался сделать это с помощью следующего кода:Как обойти java.lang.UnsupportedOperationException: не удается изменить среду?

ProcessBuilder pbuilder = new ProcessBuilder("python/bin/python", "test.py"); 
    pbuilder.directory(getFilesDir()); 
    Map<String, String> env = pbuilder.environment(); 
    env.put("PYTHONHOME", "python"); 

    Process process = pbuilder.start(); 

но я получаю это исключение:

E/AndroidRuntime(25857): FATAL EXCEPTION: main 
E/AndroidRuntime(25857): java.lang.UnsupportedOperationException: Can't modify environment 
E/AndroidRuntime(25857): at java.lang.SystemEnvironment.put(System.java:740) 
E/AndroidRuntime(25857): at java.lang.SystemEnvironment.put(System.java:688) 
E/AndroidRuntime(25857): at my code 
E/AndroidRuntime(25857): at android.view.View.performClick(View.java:2408) 
E/AndroidRuntime(25857): at android.view.View$PerformClick.run(View.java:8816) 
E/AndroidRuntime(25857): at android.os.Handler.handleCallback(Handler.java:587) 
E/AndroidRuntime(25857): at android.os.Handler.dispatchMessage(Handler.java:92) 
E/AndroidRuntime(25857): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime(25857): at android.app.ActivityThread.main(ActivityThread.java:4627) 
E/AndroidRuntime(25857): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(25857): at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime(25857): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
E/AndroidRuntime(25857): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
E/AndroidRuntime(25857): at dalvik.system.NativeStart.main(Native Method) 

Кто-нибудь есть какие-либо советы? Я попробовал обернуть вызов на python в сценарии оболочки, который экспортирует PYTHONHOME, но это не помогло.

Gabe

ответ

3

Совсем недавно столкнулся с той же проблемой. Похоже, вы не можете изменить карту окружения ProcessBuilder на версиях Android < = 2.2. Единственным обходным решением, которое я нашел, было использование exec(), а не ProcessBuilder. В вашем случае, это привело бы к чему-то вдоль линий:

String[] cmdarray = {"python/bin/python", "test.py"}; 
String[] envp = {"PYTHONHOME=python"}; 
Process process = Runtime.getRuntime().exec(cmdarray, envp, getFilesDir()); 

Надежда, что помогает.
C

Смежные вопросы