Python 预编译子进程调用 java
Python subprocess call precompiled java
这在 windows 命令行下有效:
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 class 我正在调用它,但我真的不明白我在这里做什么。
这是文件夹 bin
中的两个 mallet 文件:
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 [=19=]`
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=
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=; shift;;
*) echo "Unrecognized command: $CMD"; help; exit 1;;
esac
$JAVA_COMMAND $CLASS $*
嗯,也许问题出在反斜杠上。
来自他们的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'])
确保将 shell = True
参数传递给 subprocess.call()
。但是,它会带来安全问题,因此请务必查看文档并了解其工作原理。
subprocess.call(['c:/mallet/bin/mallet', 'run'], shell = True)
此外,当使用字符串来识别包含反斜杠的路径时,将其设为原始字符串 (r"This is a raw string!"
),这样它就不会实现任何其他内容(例如换行符)。
如果我的上述建议不起作用,我只能做两件事:
- 您尝试执行的文件可能不是应用程序文件(
.exe
文件)。我不与 Windows 合作,所以我不确定这个,但它可能是一种可能性。
- 文件中的某些内容已损坏或类似问题。
当您调用没有扩展名的程序时,Windows shell 将尝试几个标准扩展名(.BAT
、.EXE
、...)以便 猜测您要调用的文件。
如果您想在没有 shell 执行该查找阶段的情况下执行您的程序,您需要传递您尝试执行的批处理的全名 -- 包括。 .BAT
扩展名:
subprocess.call(['c:/mallet/bin/mallet.bat', 'run'])
这在 windows 命令行下有效:
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 class 我正在调用它,但我真的不明白我在这里做什么。
这是文件夹 bin
中的两个 mallet 文件:
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 [=19=]`
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=
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=; shift;;
*) echo "Unrecognized command: $CMD"; help; exit 1;;
esac
$JAVA_COMMAND $CLASS $*
嗯,也许问题出在反斜杠上。
来自他们的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'])
确保将 shell = True
参数传递给 subprocess.call()
。但是,它会带来安全问题,因此请务必查看文档并了解其工作原理。
subprocess.call(['c:/mallet/bin/mallet', 'run'], shell = True)
此外,当使用字符串来识别包含反斜杠的路径时,将其设为原始字符串 (r"This is a raw string!"
),这样它就不会实现任何其他内容(例如换行符)。
如果我的上述建议不起作用,我只能做两件事:
- 您尝试执行的文件可能不是应用程序文件(
.exe
文件)。我不与 Windows 合作,所以我不确定这个,但它可能是一种可能性。 - 文件中的某些内容已损坏或类似问题。
当您调用没有扩展名的程序时,Windows shell 将尝试几个标准扩展名(.BAT
、.EXE
、...)以便 猜测您要调用的文件。
如果您想在没有 shell 执行该查找阶段的情况下执行您的程序,您需要传递您尝试执行的批处理的全名 -- 包括。 .BAT
扩展名:
subprocess.call(['c:/mallet/bin/mallet.bat', 'run'])