【问题标题】:Execute process from the windows command line in Python在 Python 中从 windows 命令行执行进程
【发布时间】:2013-07-29 17:57:14
【问题描述】:

我想知道如何在 Windows 8 上的 Python 2.7 中使用 windows 命令行执行这个 java 进程。

我以为我已经解决了这个问题,但我最近将计算机从 Windows 7 更改为 Windows 8,我的代码停止工作。我已经确认下面脚本中使用的 windows 命令在直接从 cmd.exe 运行时可以正确执行

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 不再被识别为命令。

【问题讨论】:

  • 您能否向我们展示您使用的 inFile 值?
  • 在代码中提供。它只是 .txt 文件的绝对路径。
  • 尝试像这样打印出您的 cmd 变量:print " ".join(cmd),然后尝试从 cmd.exe 运行它
  • 该打印语句产生:“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 C:\NSF_Stuff\ErrorPropagationPaper\RandomTuftsPlain\PreprocessedTufts8199PLAIN.txt”,当我从相同位置运行命令行时,它会产生正确的输出python 脚本正在执行。
  • 尝试在你的脚本中运行print os.environ['PATH']并检查你是否有java

标签: python windows python-2.7 cmd


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    通过尝试您的代码,它会打印出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 用于扩展剥离。

    【讨论】:

    • 感谢您的回复。问题出在此问题之前的某个地方,因为此时根本没有创建 xml 文件。
    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多