2014-02-05 5 views
0

В сущности У меня есть эта программа:Почему моя программа Python не работает при вызове с Java?

from sympy.solvers import solve 
from sympy import Symbol 
x = Symbol('x') 
print solve(x**2 - 1, x) 

И я называю это от Java, используя этот код:

public static BufferedReader runFile(Class<?> c, String py, List<String> args) { 
    String cmd = c.getResource(py).getPath(); 
    cmd=cmd.split(py)[0]; 
    cmd=cmd.substring(0,cmd.length()-1); 
    args.add(0, py); 
    args.add(0, "python"); 
    final ProcessBuilder pb = new ProcessBuilder(args); 
    new ProcessBuilder(); 
    pb.directory(new File(cmd)); 
    pb.redirectError(); 
    try { 
     System.out.println(pb.directory().getPath()); 
     for(String s:pb.command()){ 
      System.out.println(s); 
     } 
     Process p=pb.start(); 
     return new BufferedReader(new InputStreamReader(p.getErrorStream())); 
    } 
    catch (final IOException e) { 
     throw new RuntimeException(e); 
    } 
} 

При запуске программы на Python от терминала все работает, как задумано, ни с чем в поток ошибок, и он печатает [-1,1]. Но если я запускаю его из программы, я получаю это в потоке ошибок:

Traceback (most recent call last): 
    File "solve.py", line 1, in <module> 
    from sympy.solvers import solve 
ImportError: No module named sympy.solvers 
+0

Вы используете virtualenv или что-то в этом роде? – jpmc26

+0

@ jpmc26 не уверен, что это такое, но нет. Я использую raw java 7 и python 2.7. Наряду с симпатией. – Others

+0

Вы установили sympy по всему миру? Как, если так? – jpmc26

ответ

2

Поскольку указание полного пути Python устраняет вашу проблему, у вас, скорее всего, есть mu Установки Python в вашей системе. Вместо того, чтобы PYTHONPATH быть другим, я подозреваю, что это действительно PATH, что отличается. В результате ваша командная строка использует интерпретатор Python, который вы намереваетесь, в то время как Java использует другую.

Чтобы определить, где находится эта альтернативная установка, может оказаться полезным which -a python, но если нет, проверьте PATH внутри вашего Java-кода и посмотрите, можете ли вы найти Python в одном из этих каталогов.

Независимо от того, если вам действительно нужно указать полный путь Python в Java, вы должны сделать этот вариант конфигурации. На разных машинах это, вероятно, будет отличаться. Хранение его в файле кажется наиболее разумным.

1

Вашего PYTHONPATH (или менее вероятно, ваш рабочий каталог) отличается при работе от вашего контекста Java.

Вы можете

import sys 
print sys.path 

, которые могут помочь вам обеспечить путь одинаков для обоих.

Расскажите нам больше о том, как настроена ваша среда, чтобы получить более конкретные ответы.

например. Может быть, Java работает через веб-сервер или что-то еще?


Вот несколько способов, чтобы исправить проблему пути:

Убедитесь, что каталог, содержащий sympy в переменной окружения PYTHONPATH

Если вы действительно отчаянным, добавьте правильный каталог в sys.path

import sys 
sys.append("/some/dir/with/sympy") 
from sympy.solvers import solve 
... 
+0

Я не думаю, что проблема «PYTHONPATH». Python добавляет глобальные 'site-packages' к' sys.path' самостоятельно, независимо от того, установлен ли вы 'PYTHONPATH' или нет. Разве есть способ переопределить это поведение? (Я уверен, что virtualenv делает что-то забавное, но это не в игре.) Однако проверка 'sys.path' не повредит. – jpmc26

+0

@ jpmc26, даже возможно, что OP запускает совершенно другой экземпляр интерпретатора Python для всего, что я знаю. Есть действительно несколько причин, почему этот модуль не может быть найден, но это будет очень трудно догадаться без дополнительных вкладок от плаката. –

+0

ОК PYTHONPATH отличается. Есть ли способ, которым я могу обходить модуль, который не присутствует. – Others

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