【问题标题】:running mulitple commands using Subprocess.Popen in the same shell在同一个 shell 中使用 Subprocess.Popen 运行多个命令
【发布时间】:2017-10-12 08:40:01
【问题描述】:

您好,我不知道如何使用 popen 运行多个命令, 我正在尝试自动化通常在 Windows 命令行上运行的一系列步骤。基本步骤通常是从 Windows cmd 行运行的

  1. 运行 Windows 命令脚本 (.cmd) 文件以设置环境变量,即 C:\Program Files (x86)\appsettings\setupvariables.cmd
  2. 输入命令以连接到数据库
  3. 输入命令以从数据库中获取数据
  4. 停止与数据库的连接

所有这些命令必须一个接一个地在同一个命令行窗口中运行,而不是单独的进程或单独的命令行窗口。我不想打开 cmd 窗口并输入命令,而是使用 python 的 subprocess.popen 命令

到目前为止,我有:

args=[]
args.append(r'C:\Program Files (x86)\appsettings\setmyvars.cmd')
args.append(r'start db on db_path="my_url"')
args.append(r'get_data_from_db>c:\temp\output.txt')
args.append(r'stop db on db_path="my_url"')

p=Popen(args,stdout=PIPE,sterr=PIPE,shell=True)
stdout,stderr=p.communicate()
if stderr:
    print "you have an error", stderr
else:
    print "well done you have data", stdout

这不是很有效,我可以看到第一行已运行,即 setmyvars.cmd 已执行,但没有其他任何参数被调用,如果它们调用了,我会在输出中看到结果。 txt 文件。

如何使用 popen 一个接一个地运行一系列命令。为什么似乎只执行了第一个命令,而其他命令都没有执行

我在 Windows 上使用 python2.7

问候。

【问题讨论】:

  • 您可以使用& 连接命令,但为什么不为此创建一个批处理文件呢?
  • 另外,使用字符串而不是带有shell=True 的参数列表。通常子进程不知道如何为 cmd.exe 构建带有特殊字符转义的命令行。

标签: windows python-2.7 shell cmd subprocess


【解决方案1】:

您遇到了几个问题。你仍然需要告诉 popen() 运行哪个程序。仅使用shell=True 并不能排除提供cmd.exe 作为运行程序的需要。如果您真的想通过一次调用 cmd.exe 来运行所有这些命令,那么您需要将它们与&& 串在一起。

from subprocess import *

args=[]
args.append(r'C:\Windows\System32\cmd.exe')
args.append(r'/C')
args.append(r'(echo 1 && echo 2 && echo 4)')

p = Popen(args,stdout=PIPE,stderr=PIPE,shell=True)
stdout,stderr=p.communicate()
if stderr:
    print "you have an error", stderr
else:
    print "well done you have data", stdout

使用 %ComSpec% 环境变量可能比硬编码 cmd.exe 的位置更好。您拥有的路径通常是正确的。 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多