在同一个shell中使用Subprocess.Popen运行多个命令

时间:2017-05-12 23:22:49

标签: windows python-2.7 shell cmd subprocess

嗨,我对如何使用popen运行多个命令感到茫然, 我试图自动执行通常在Windows命令行上运行的一系列步骤。基本步骤通常从Windows cmd行运行

  1. 运行Windows命令脚本(.cmd)文件以设置环境变量,即C:\ Program Files(x86)\ appsettings \ setupvariables.cmd
  2. 输入连接数据库的命令
  3. 输入命令以从数据库中获取数据
  4. 停止与数据库的连接
  5. 所有这些命令必须一个接一个地在同一命令行窗口中运行,而不是单独的进程或单独的命令行窗口。而不是打开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

    的问候。

1 个答案:

答案 0 :(得分:0)

你有几个问题正在发生。你仍然需要告诉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的位置更好。您拥有的路径通常是正确的。 : - )