Python Popen挂起,但Windows cmd窗口中的相同命令运行正常

时间:2017-07-03 09:14:10

标签: python cmd

我正在把头发拉出来。我正在产生一个我需要Python反馈的过程。

当我在cmd窗口中运行该命令时,它运行正常,但是当我尝试通过Python运行它时终端挂起。

p = subprocess.Popen(startcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(out, err) = p.communicate()

其中startcmd是一个字符串,在Python控制台中打印时如下所示:

"C:/Program Files/GRASS GIS 7.2.1/grass72.bat" --version

如果我将其复制并粘贴到Windows cmd中,它会显示版本信息,并在稍后的一秒钟内将控制权返回给命令提示符,但在Python中会冻结。

我应该指出,如果我用startcmd甚至"dir"替换"python --version"字符串,它就可以正常工作!

其他:我尝试了shell=True,结果相同。

其他:我已经尝试将cmd和参数作为数组发送,如下面的答案中所建议的shell=False,但这也是相同的。

附加:我已将GRASS路径添加到系统PATH,现在我只需在cmd窗口中调用grass72 --version即可获得结果,但这仍然会冻结在Python但在cmd中工作正常。

附加:我创建了一个基本的.bat文件来测试.bat文件是否可以通过Python运行,这是我创建的:

@echo off
title Test Batch Script
echo I should see this message

这在cmd和Python中都运行良好。

发现问题但未解决!

因此,我正在运行使用Python 3.6使用subprocess.Popen生成进程的脚本。生成的.bat文件使用随GRASS附带的Python版本(基于2.7)启动Python脚本:

%GRASS_PYTHON% "\BLAH\BLAH\grass72.py"

有趣的是,如果我使用Python 2.7启动subprocess.Popen脚本,它可以正常工作。啊哈,你可能会想,已经解决了!但是这并没有解决我的问题 - 因为我真的需要Python 3.6来启动这个过程,为什么Python的哪个版本启动批处理文件也很重要?生成的新Python脚本无论如何都是用Python 2.7启动的。

自从我开始重新引导stdout后,我可以看到当我使用Python 3.6启动该过程时出现错误:

 File "C:\ProgramData\Anaconda3\lib\site.py", line 177
    file=sys.stderr)
        ^
SyntaxError: invalid syntax

注意它恢复到Anaconda3!即使它是使用2.7的python.exe启动的!

2 个答案:

答案 0 :(得分:0)

试试这个:

p = subprocess.Popen(startcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

答案 1 :(得分:0)

您未在shell=True的参数中指定Popen。在这种情况下,建议使用的是指定参数序列而不是字符串。因此,您应将startcmd设置为["C:/Program Files/GRASS GIS 7.2.1/grass72.bat", "--version"]