代码之家  ›  专栏  ›  技术社区  ›  AracKnight

python(windows)中的多个shell命令

  •  0
  • AracKnight  · 技术社区  · 7 年前

    我在一台Windows机器上工作,我想在shell中设置一个变量,并想将它与另一个shell命令一起使用,例如:

    set variable = abc
    echo %variable%
    

    我知道我可以用 os.system(com1 && com2) 但我也知道,这被认为是“糟糕的风格”,应该可以通过使用子流程模块来实现,但我不知道如何实现。 以下是我迄今为止所得到的:

    proc = Popen('set variable=abc', shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
    proc.communicate(input=b'echo %variable%)
    

    但这两行似乎都不起作用,这两个命令都不会被执行。另外,如果我输入不存在的命令,我不会得到错误。正确的方法是什么?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Giacomo Alzetta    7 年前

    Popen 只能执行一个命令或shell脚本。您可以使用 ; 要分离不同的命令:

    proc = Popen('set variable=abc;echo %variable%', shell=True)
    

    或者您可以实际使用多行字符串:

    >>> from subprocess import call
    >>> call('''echo 1
    ... echo 2
    ... ''', shell=True)
    1
    2
    0
    

    决赛 0 是进程的返回代码

    这个 communicate 方法用于写入进程的stdin。在您的情况下,进程在运行后立即结束 set variable 所以我要打电话给 沟通 什么都不做。

    你可以生成一个外壳然后使用 沟通 要编写命令:

    >>> proc = Popen(['sh'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
    >>> proc.communicate('echo 1; echo 2\n')
    ('1\n2\n', '')
    

    注意 沟通 也会在完成后关闭流,因此不能多次调用它。如果你想要一个互动会话,你可以直接写信给 proc.stdin 从中读取 proc.stdout .


    顺便说一下:您可以指定 env 参数 波彭 所以 视情况而定 您可能需要这样做:

    proc = Popen(['echo', '%variable%'], env={'variable': 'abc'})
    

    显然,这将使用 echo 可执行,而不是shell内置,但它避免使用 shell=True .