【问题标题】:Why is Popen("cmd.exe echo a", shell=True) not running "echo"?为什么 Popen("cmd.exe echo a", shell=True) 没有运行“echo”?
【发布时间】:2017-11-06 09:36:15
【问题描述】:

这导致我遇到herePopen() 的更大问题。

以下内容没有做我认为应该做的事情:

x = subprocess.Popen("cmd.exe echo a", stdout=PIPE, shell=True)
print (x.stdout.read())

返回 cmd 控制台的“title”消息,但永远不会执行 echo a

同理:

x = subprocess.Popen(["cmd.exe", "echo a"], stdout=PIPE)
print (x.stdout.read())

cmd = "cmd.exe echo a"
x = subprocess.Popen(shlex.split(cmd), stdout=PIPE)
print (x.stdout.read())

最终结果是在打开的 cmd 终端中打印标准的“Microsoft Windows 版本...”和 C:\Python36> 的 CLI 位置。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    cmd.exe 需要参数 /c 在传递执行的脚本之前:

    x = subprocess.Popen(["cmd.exe", "/c", "echo a"], stdout=PIPE)
    print (x.stdout.read())
    

    【讨论】:

    • 现在如果我想要stdoutC:\Users\Me> C:\path\to\app.exe arg1 arg2 怎么办?如果我打开一个 cmd 控制台并提供 .exe 路径和 args,则输出会生成到 stdout,但我似乎无法在我的 OP 链接中使用 subprocess 进行复制。
    【解决方案2】:

    当您指定shell=True 时,命令处理器cmd.exe 是隐式的。

    >>> x = subprocess.Popen("echo a", stdout=subprocess.PIPE, shell=True)
    >>> print (x.stdout.read())
    a
    

    通过显式调用它,您将启动一个嵌套的命令控制台,就好像您在提示符下键入了cmd.exe。它的输出不会进入Popen() 的管道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多