【问题标题】:Working with Command Prompt through Python通过 Python 使用命令提示符
【发布时间】:2015-04-16 01:11:04
【问题描述】:

我想制作一个脚本,它可以打开命令提示符窗口并在该提示符中输入命令,而无需任何用户交互。我一直在使用 subprocess 模块,但收效甚微。到目前为止我所拥有的:

def subprocess_cmd(command):
    process = Popen(command,stdout=PIPE, shell=True)
    proc_stdout = process.communicate()[0].strip()
    print proc_stdout


subprocess_cmd('"C:\system\cmd.exe" & C:\dir\mybat.bat & C:\dir\gdal_translate C:\dir2\mypdf.pdf C:\dir\mytif.tif')

现在它运行没有错误,但没有任何反应。 dir2 文件夹中应该有一个 .tif 文件,但正如我所说,什么都没有出现。当我自己运行命令提示符时,它工作正常。

【问题讨论】:

  • 与其尝试在一行中运行,不如用python创建一个批处理文件,然后通过cmd.exe运行那个批处理文件?
  • 我对 Windows shell 的东西有点生疏了,但是第一个 cmd.exe 真的按照你的意图做吗?我认为它会启动一个新的 shell,并且在您手动退出 shell 之前,它永远不会进入 & 之后的命令。

标签: python command subprocess


【解决方案1】:

我认为问题在于您没有从 subprocess 类中调用方法和常量。这在 Python 3 中对我有用:

import subprocess

def subprocess_cmd(command,c="C:\\Users\\Alex"):
    process = subprocess.Popen(command,stdout=subprocess.PIPE,shell=True,cwd=c)
    proc_stdout = process.communicate()[0].strip()
    print(proc_stdout)

>>> subprocess_cmd('"cmd.exe" && "C:\\Users\\Alex\\test.bat"','C:\\Users\\Alex\\')
b'Microsoft Windows [Version 6.3.9600]\r\n(c) 2013 Microsoft Corporation. All rights reserved.\r\n\r\nC:\\Users\\Alex>\r\nC:\\Users\\Alex>mkdir thisisanewdirectory'

>>> subprocess_cmd('test.bat')
b'C:\\Users\\Alex>mkdir thisisanewdirectory'

【讨论】:

  • 我只是通过使用:from subprocess import Popen 让自己变得更轻松。我按你写的方法试了,还是不行。
  • 问题是 C:\dir\mybat.bat 似乎正在打印到 Python 解释器,所以它正在识别它。
  • @WillB 也许子进程的工作目录当前设置为 Python 可执行文件所在的位置? Is this relevant? 另外,您只有一个用引号括起来的命令,这可能是问题的一部分吗?
  • 问题似乎出在cmd。我认为this comment 解释了你所看到的。而且您可能必须单独运行这些命令。
  • 所以你说我应该运行 (& [...] command1 & command2) 行,但要分开运行。如果你有时间,你能再解释一下吗?感谢您的调查。
猜你喜欢
  • 2018-12-08
  • 2021-01-31
  • 2012-05-22
  • 2021-09-26
  • 2021-07-07
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多