2015-03-27 3 views
1

Это работает из командной строки окна:Python подпроцесс вызов прекомпилирована Java

c:\mallet\bin\mallet run 

Я попытался

subprocess.call(['c:\mallet\bin\mallet', 'run']) 

и получить ошибку

WindowsError: [Error 2] The system cannot find the file specified 

и я попытался

subprocess.call(['c:/mallet/bin/mallet', 'run']) 

и получить ошибку

WindowsError: [Error 193] %1 is not a valid Win32 application 

Что я должен пройти subprocess.call()?

Для полноты полной команды, которую я хотел бы передать это:

bin\mallet run cc.mallet.topics.tui.DMRLoader texts.txt features.txt instance.mallet 

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

Вот два Маллет-файлы в папке bin:

mallet.bat

@echo off 

rem This batch file serves as a wrapper for several 
rem MALLET command line tools. 

if not "%MALLET_HOME%" == "" goto gotMalletHome 

echo MALLET requires an environment variable MALLET_HOME. 
goto :eof 

:gotMalletHome 

set MALLET_CLASSPATH=%MALLET_HOME%\class;%MALLET_HOME%\lib\mallet-deps.jar 
set MALLET_MEMORY=1G 
set MALLET_ENCODING=UTF-8 

set CMD=%1 
shift 

set CLASS= 
if "%CMD%"=="import-dir" set CLASS=cc.mallet.classify.tui.Text2Vectors 
if "%CMD%"=="import-file" set CLASS=cc.mallet.classify.tui.Csv2Vectors 
if "%CMD%"=="import-smvlight" set CLASS=cc.mallet.classify.tui.SvmLight2Vectors 
if "%CMD%"=="train-classifier" set CLASS=cc.mallet.classify.tui.Vectors2Classify 
if "%CMD%"=="train-topics" set CLASS=cc.mallet.topics.tui.Vectors2Topics 
if "%CMD%"=="infer-topics" set CLASS=cc.mallet.topics.tui.InferTopics 
if "%CMD%"=="estimate-topics" set CLASS=cc.mallet.topics.tui.EstimateTopics 
if "%CMD%"=="hlda" set CLASS=cc.mallet.topics.tui.HierarchicalLDATUI 
if "%CMD%"=="prune" set CLASS=cc.mallet.classify.tui.Vectors2Vectors 
if "%CMD%"=="split" set CLASS=cc.mallet.classify.tui.Vectors2Vectors 
if "%CMD%"=="bulk-load" set CLASS=cc.mallet.util.BulkLoader 
if "%CMD%"=="run" set CLASS=%1 & shift 

if not "%CLASS%" == "" goto gotClass 

echo Mallet 2.0 commands: 
echo import-dir  load the contents of a directory into mallet instances (one per file) 
echo import-file  load a single file into mallet instances (one per line) 
echo import-svmlight load a single SVMLight format data file into mallet instances (one per line) 
echo train-classifier train a classifier from Mallet data files 
echo train-topics  train a topic model from Mallet data files 
echo infer-topics  use a trained topic model to infer topics for new documents 
echo estimate-topics estimate the probability of new documents given a trained model 
echo hlda    train a topic model using Hierarchical LDA 
echo prune    remove features based on frequency or information gain 
echo split    divide data into testing, training, and validation portions 
echo Include --help with any option for more information 


goto :eof 

:gotClass 

set MALLET_ARGS= 

:getArg 

if "%1"=="" goto run 
set MALLET_ARGS=%MALLET_ARGS% %1 
shift 
goto getArg 

:run 

java -Xmx%MALLET_MEMORY% -ea -Dfile.encoding=%MALLET_ENCODING% -classpath %MALLET_CLASSPATH% %CLASS% %MALLET_ARGS% 

:eof 

и mallet

#!/bin/bash 


malletdir=`dirname $0` 
malletdir=`dirname $malletdir` 

cp=$malletdir/class:$malletdir/lib/mallet-deps.jar:$CLASSPATH 
#echo $cp 

MEMORY=1g 

JAVA_COMMAND="java -Xmx$MEMORY -ea -Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -classpath $cp" 

CMD=$1 
shift 

help() 
{ 
cat <<EOF 
Mallet 2.0 commands: 

    import-dir   load the contents of a directory into mallet instances (one per file) 
    import-file  load a single file into mallet instances (one per line) 
    import-svmlight load SVMLight format data files into Mallet instances 
    train-classifier train a classifier from Mallet data files 
    classify-dir  classify data from a single file with a saved classifier 
    classify-file  classify the contents of a directory with a saved classifier 
    classify-svmlight classify data from a single file in SVMLight format 
    train-topics  train a topic model from Mallet data files 
    infer-topics  use a trained topic model to infer topics for new documents 
    evaluate-topics estimate the probability of new documents under a trained model 
    hlda    train a topic model using Hierarchical LDA 
    prune    remove features based on frequency or information gain 
    split    divide data into testing, training, and validation portions 

Include --help with any option for more information 
EOF 
} 

CLASS= 

case $CMD in 
    import-dir) CLASS=cc.mallet.classify.tui.Text2Vectors;; 
    import-file) CLASS=cc.mallet.classify.tui.Csv2Vectors;; 
     import-svmlight) CLASS=cc.mallet.classify.tui.SvmLight2Vectors;; 
    train-classifier) CLASS=cc.mallet.classify.tui.Vectors2Classify;; 
     classify-dir) CLASS=cc.mallet.classify.tui.Text2Classify;; 
     classify-file) CLASS=cc.mallet.classify.tui.Csv2Classify;; 
     classify-svmlight) CLASS=cc.mallet.classify.tui.SvmLight2Classify;; 
    train-topics) CLASS=cc.mallet.topics.tui.Vectors2Topics;; 
    infer-topics) CLASS=cc.mallet.topics.tui.InferTopics;; 
    evaluate-topics) CLASS=cc.mallet.topics.tui.EvaluateTopics;; 
    hlda) CLASS=cc.mallet.topics.tui.HierarchicalLDATUI;; 
    prune) CLASS=cc.mallet.classify.tui.Vectors2Vectors;; 
    split) CLASS=cc.mallet.classify.tui.Vectors2Vectors;; 
    bulk-load) CLASS=cc.mallet.util.BulkLoader;; 
    run) CLASS=$1; shift;; 
    *) echo "Unrecognized command: $CMD"; help; exit 1;; 
esac 

$JAVA_COMMAND $CLASS $* 
+0

Я напечатал 'ассоциативный C: \ Молоток \ Bin \ mallet' в окна командной строки и возврат был' ассоциации Файл не найден для расширения C: \ Молоток \ Bin \ mallet' Я пробовал также с '/' с теми же результатами. –

+0

Вы пробовали какие-либо предложения в ответах? – Zizouz212

+0

Проблема в том, что 'c: \ mallet \ bin \ mallet' не является чрезмерным, что такое' c: \ mallet \ bin \ mallet'? Если это java-файл, почему бы не запустить его с помощью java? –

ответ

3

При вызове программы без расширения, оболочка для Windows попытается несколько стандартных расширений (.BAT, .EXE, ...) для того, чтобы догадка файл, который вы пытаются позвонить.

Если вы хотите выполнить свою программу без оболочки для выполнения этой фазы поиска, вам необходимо передать полное имя партии, которую вы пытаетесь выполнить, в том числе. .BAT расширение:

subprocess.call(['c:/mallet/bin/mallet.bat', 'run']) 
+1

: [о различии между командами 'CreateProcess' (по умолчанию) и' cmd.exe' ('shell = True')] (http://stackoverflow.com/a/25167402/4279). – jfs

+0

Yaay! Вы решили проблему! :) – Zizouz212

-1

Ну, может быть, проблема с обратной косой черты.

от их docs:

The backslash (\) character is used to escape characters that otherwise have a special meaning, such as newline, backslash itself, or the quote character.

Таким образом, вы, вероятно, следует сделать:

subprocess.call(['c:\\mallet\\bin\\mallet', 'run']) 
+0

OP отмечает, что они пробовали косые черты, которые интерпретируются так же, как и обратная косая черта, и их не нужно избегать. – jedwards

+0

Спасибо за предложение. Я попробовал и получил 'WindowsError: [Ошибка 193]% 1 не является допустимой ошибкой приложения Win32. –

0

Убедитесь, что вы передаете shell = True аргумент subprocess.call(). Тем не менее, это создает проблемы безопасности, поэтому убедитесь, что вы смотрите на документацию и понимаете, как она работает.

subprocess.call(['c:/mallet/bin/mallet', 'run'], shell = True) 

Кроме того, при использовании строки для выявления путей, которые содержат символы, делают это строка (r"This is a raw string!"), так что ничего другого (например, символ новой строки лексем) не реализует.

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

  1. В файле вы пытаетесь выполнить не может быть файл приложения (.exe файл). Я не работаю с Windows, поэтому я не уверен в этом, но, скорее всего, это будет возможно.
  2. Что-то в файле нарушено или что-то в этом роде.

subprocess.call() docs

subprocess.call() Security Issues

+0

Спасибо за предложение. Есть ли у вас какие-либо идеи о том, какие проблемы с безопасностью, используя shell = True? Я думаю, что маловероятно, что молоток будет представлять угрозу безопасности. Я попробовал 'r' перед строкой, но получил то же самое:' WindowsError: [Ошибка 193]% 1 не является допустимой ошибкой приложения Win32. –

+0

Единственные проблемы безопасности, которые накладывает 'shell = True', - это команды, основанные на внешнем вводе. Я поставлю ссылку на документы. Я сомневаюсь, что вам все равно придется беспокоиться об этом в этом случае;) – Zizouz212

+0

Ваш ответ работает, и я собираюсь принять его через день или два, но просто хотел бы услышать, есть ли у кого-нибудь предложение, как получить 'subprocess.call()' работать без 'shell = True'. –

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