python中的多个shell命令(Windows)

时间:2018-08-22 14:43:11

标签: python windows python-3.x subprocess popen

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

set variable = abc
echo %variable%

我知道我可以使用os.system(com1 && com2)来做到这一点,但是我也知道,这被认为是“不良样式”,应该可以通过使用subprocess模块​​来实现,但是我不知道如何做到。 这是到目前为止我得到的:

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

但是这两行似乎都不起作用,两个命令都没有执行。另外,如果键入不存在的命令,也不会出现错误。正确的方法是怎么做到的?

1 个答案:

答案 0 :(得分:0)

;只能执行一个命令或Shell脚本。您可以使用proc = Popen('set variable=abc;echo %variable%', shell=True) 来简单地将整个shell脚本作为单个参数提供,以分隔不同的命令:

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

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

0

最后的communicate是进程的返回码

set variable方法用于写入进程的标准输入。对于您来说,该过程在运行communicate之后立即结束,因此对communicate的调用实际上并没有执行任何操作。

您可以生成外壳,然后使用>>> proc = Popen(['sh'], stdin=PIPE, stdout=PIPE, stderr=PIPE) >>> proc.communicate('echo 1; echo 2\n') ('1\n2\n', '') 编写命令:

communicate

请注意,proc.stdin完成后也会关闭流,因此您不能多次调用它。如果要进行交互式会话,则需要直接写到proc.stdout并从env中读取。


顺便说一句:您可以为Popen指定一个proc = Popen(['echo', '%variable%'], env={'variable': 'abc'}) 参数,所以根据情况您可能想要这样做:

echo

很显然,这将使用shell=True可执行文件,而不是内置的shell,但避免使用{{1}}。