我正在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%)
但是这两行似乎都不起作用,两个命令都没有执行。另外,如果键入不存在的命令,也不会出现错误。正确的方法是怎么做到的?
答案 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}}。