我想知道如何使用Windows命令行在Windows 8上的Python 2.7中执行此java进程。
我以为我已经解决了这个问题,但最近我将计算机从Windows 7更改为Windows 8,我的代码停止了工作。我已确认直接从cmd.exe
运行时,下面脚本中使用的Windows命令可正常执行import os
import subprocess
def FileProcess(inFile):
#Create the startup info so the java program runs in the background (for windows computers)
startupinfo = None
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
#Execute Stanford Core NLP from the command line
print inFile
cmd = ['java', '-Xmx1g','-cp', 'stanford-corenlp-1.3.5.jar;stanford-corenlp-1.3.5-models.jar;xom.jar;joda-time.jar', 'edu.stanford.nlp.pipeline.StanfordCoreNLP', '-annotators', 'tokenize,ssplit,pos,parse', '-file', inFile]
output = subprocess.call(cmd, startupinfo=startupinfo)
print inFile[(str(inFile).rfind('\\'))+1:] + '.xml'
outFile = file(inFile[(str(inFile).rfind('\\'))+1:] + '.xml')
FileProcess("C:\\NSF_Stuff\\ErrorPropagationPaper\\RandomTuftsPlain\\PreprocessedTufts8199PLAIN.txt")
执行此代码时,我收到输出文件不存在的错误消息。我正在执行的java进程应该在完成后输出一个xml文件。
我认为,由于某种原因,subprocess.call永远不会成功执行命令。我尝试使用subprocesss.popen执行相同的任务,我得到了相同的结果。
编辑:我已经更改了我的代码,以便我可以捕获错误消息,我想我已经开始理解这个问题。我将代码更改为
import os
import subprocess
def FileProcess(inFile):
#Create the startup info so the java program runs in the background (for windows computers)
startupinfo = None
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
#Execute Stanford Core NLP from the command line
print inFile
cmd = ['java', '-Xmx1g','-cp', 'stanford-corenlp-1.3.5.jar;stanford-corenlp-1.3.5-models.jar;xom.jar;joda-time.jar', 'edu.stanford.nlp.pipeline.StanfordCoreNLP', '-annotators', 'tokenize,ssplit,pos,parse', '-file', inFile]
proc = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=True)
print proc
stdoutdata, stderrdata = proc.communicate()
print stdoutdata
print stderrdata
outFile = file(inFile[(str(inFile).rfind('\\'))+1:] + '.xml')
FileProcess("C:\\NSF_Stuff\\ErrorPropagationPaper\\RandomTuftsPlain\\PreprocessedTufts8199PLAIN.txt")
stdoutdata包含消息“'java'未被识别为内部或外部命令,可操作程序或批处理文件。”
现在这是一个非常奇怪的消息,因为当我从cmd.exe运行它时,java绝对是一个公认的命令。这里存在一些问题,即从python执行命令会弄乱我的系统环境变量,使得java不再被识别为命令。
答案 0 :(得分:1)
我能够通过将java的位置添加到我的PATH变量来解决我的问题。显然java不在我的路径变量中。我最初没有打扰检查这个,因为我从windows命令行执行java命令没有问题。我猜测直接从cmd.exe执行的命令使用不同的环境变量来查找java可执行文件,而不是从子进程模块间接执行的命令。
答案 1 :(得分:0)
通过尝试您的代码,它会打印出PreprocessedTufts8199PLAIN.txt.xml
文件名。我不确定.txt.xml
扩展名是否是期望的结果。如果您的文件只有.xml
扩展名,那么您就不会删除原来的.txt
标题。
尝试更改此行:
outFile = file(inFile[(str(inFile).rfind('\\'))+1:] + '.xml')
进入此代码:
fnameext = inFile[(str(inFile).rfind('\\'))+1:]
fname,fext = os.path.splitext(fnameext)
xmlfname = fname + '.xml'
xmlfpath = os.path.join(".", xmlfname)
print "xmlfname:", xmlfname, " xmlfpath:", xmlfpath
print "current working directory:", os.getcwd()
outFile = open(xmlfpath, "r")
Answer用于扩展剥离。