Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中从windows命令行执行进程_Python_Windows_Python 2.7_Cmd - Fatal编程技术网

在Python中从windows命令行执行进程

在Python中从windows命令行执行进程,python,windows,python-2.7,cmd,Python,Windows,Python 2.7,Cmd,我想知道如何在Windows8上的Python2.7中使用windows命令行执行这个java进程 我以为我已经解决了这个问题,但最近我把电脑从Windows7换成了Windows8,我的代码停止了工作。我已经确认,当直接从cmd.exe运行时,下面脚本中使用的windows命令正确执行 import os import subprocess def FileProcess(inFile): #Create the startup info so the java program ru

我想知道如何在Windows8上的Python2.7中使用windows命令行执行这个java进程

我以为我已经解决了这个问题,但最近我把电脑从Windows7换成了Windows8,我的代码停止了工作。我已经确认,当直接从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不再被识别为命令。

通过尝试您的代码,它会打印出
preprocessdufts8199plain.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")

用于扩展剥离。

我能够通过将java的位置添加到PATH变量中来解决我的问题。显然java不在我的path变量中。最初我甚至没有检查这个问题,因为从windows命令行执行java命令没有问题。我猜直接从cmd.exe执行的命令使用不同的环境变量来查找java可执行文件,而不是从子流程模块间接执行的命令。

您能告诉我们您使用的填充值吗?代码中提供了该值。它只是.txt文件的绝对路径。请尝试按如下方式打印cmd变量:
print”“。加入(cmd)
,然后尝试从cmd.exe运行它,print语句将生成:“java-Xmx1g-cp stanford-corenlp-1.3.5.jar;斯坦福-corenlp-1.3.5-models.jar;xom.jar;joda-time.jar edu.stanford.nlp.pipeline.StanfordCoreNLP-注释器标记、ssplit、pos、parse-文件C:\NSF_Stuff\ErrorPropagationPaper\RandomTuftsPlain\PreprocessedTufts8199PLAIN.txt”,当我从python脚本执行的同一位置运行命令行时,它会从命令行生成正确的输出。尝试运行
print os.environment['PATH']
在您的脚本中,检查是否有java用于响应。问题出现在这个问题之前的某个地方,因为此时根本没有创建xml文件。