2012-04-09 2 views
0

Я пытаюсь повторно выполнить внешнюю программу с питоном через следующий код ...не subprocess.call действует как задумано

3 javarun='java -classpath /home/jrm6u/code/weka_dir/weka.jar' 
4 java1='java' 
5 java2='-classpath' 
6 java3='/home/jrm6u/code/weka_dir/weka.jar' 
7 weka_args='weka.clusterers.DBScan' 
8 db_type='weka.clusterers.forOPTICSAndDBScan.Databases.SequentialDatabase' 
9 db_dist='weka.clusterers.forOPTICSAndDBScan.DataObjects.EuclidianDataObject' 

...

28 traindir = './arff_dir/' 
29 trainfile = 'of3_O_0_0.arff' 
30 trainer = traindir + trainfile 

...

45  subprocess.call([java1, java2, java3, weka_args, '-E', str(eps), '-M', str(min), '-I', db_type, '-D', db_dist, '-t', trainer], shell=True) 

, где eps и min - 0.125 и 10 соответственно.

при выполнении моего питона кода я получаю следующее сообщение об ошибке:

Usage: java [-options] class [args...] 
     (to execute a class) 
or java [-options] -jar jarfile [args...] 
     (to execute a jar file) 
where options include: 
-d32   use a 32-bit data model if available 
-d64   use a 64-bit data model if available 
-server  to select the "server" VM 
       The default VM is server. 

с последующим выходом после. это тот же самый результат, который я получаю при вводе просто java в оболочку bash. это заставляет меня поверить, что, как-то, subprocess.call не читает каждый аргумент. это случай? как мне нужно правильно оценить эту команду?

Обратите внимание, что эта команда может быть корректно введена в оболочку вручную, но мотивация использования этого скрипта заключается в том, чтобы она проходила через значения min и eps, а также учебные файлы, чтобы я мог выполнять их автоматически.

+0

Вы знаете, что вы можете просто форматировать аргументы как одну строку. попробуйте точную строку, которую вы запускали в оболочке, и посмотрите, что произойдет. –

+0

проблема заключается в том, что я хочу изменить некоторые аргументы, поэтому я разделяю их, чтобы их было легче изменить. java1, java2, java3 были изначально одной строкой, и возникла одна и та же проблема, из-за которой я разделил их на – drjrm3

+0

, вы всегда можете сделать форматирование самостоятельно с помощью ''% s% s% s ... "', но я предложил это в качестве отладки шаг, а не решение. Кроме того, я бы изменил java arg как точный путь к исполняемому файлу java. Кстати, стоит отметить, что вы можете интегрировать python и java без jython, используя эту библиотеку: http://jpype.sourceforge.net/ или этот: https://github.com/thouis/Python-Java-Bridge –

ответ

0

Я не думаю, что он игнорирует параметры, но я бы попытался избежать параметра Shell, если это необходимо, иногда имеет странное поведение (связанный с командной строкой, а не python).

Я ничего не знаю о Java, но, я уверен, вы даете ему неправильные параметры, эта ошибка вывода ничего нам не говорит (кроме того, что java найден и он не получает правильные параметры, это не значит, что это не получается).

Попытки отладить словарь вы проходящие в subprocess.call (даже с простой печатью или import pdb и позвонить в pdb.set_trace() получить отладчик в предыдущей строке), и проверить, если команда с этими параметрами работают, как ожидалось ,

Я знаю, что это не правильный ответ, но это слишком долго для строки комментариев.

+0

Я использую команду shell = True, потому что, если я этого не скажу, 'OSError: [Errno 2] Нет такого файла или каталога' – drjrm3

+0

@ Laurbert515 Я думаю, что вы получаете эту ошибку, потому что «java» не находится в вашем PATH, попробуйте использовать полный путь к java или добавив «java» в вашу систему PATH. – KurzedMetal