擅长:python、mysql、java
<p>有趣的问题。</p>
<p>一种有效的方法是运行命令shell,然后通过<code>stdin</code>将命令传递给它(示例使用Python 3,对于Python 2,可以跳过<code>decode()</code>调用)。注意,命令shell调用被设置为禁止除写入stdout的显式输出之外的所有内容。</p>
<pre><code>>>> import subprocess
>>> cmdline = ["cmd", "/q", "/k", "echo off"]
>>> cmd = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
>>> batch = b"""\
... set TEST_VAR=Hello World
... set TEST_VAR
... echo %TEST_VAR%
... exit
... """
>>> cmd.stdin.write(batch)
59
>>> cmd.stdin.flush() # Must include this to ensure data is passed to child process
>>> result = cmd.stdout.read()
>>> print(result.decode())
TEST_VAR=Hello World
Hello World
</code></pre>
<p>将其与单独调用<code>subprocess.call</code>的结果进行比较:</p>
<pre><code>>>> subprocess.call(["set", "TEST_VAR=Hello World"], shell=True)
0
>>> subprocess.call(["set", "TEST_VAR"], shell=True)
Environment variable TEST_VAR not defined
1
>>> subprocess.call(["echo", "%TEST_VAR%"], shell=True)
%TEST_VAR%
0
</code></pre>
<p>后两个调用看不到第一个调用设置的环境,因为所有3个调用都是不同的子进程。</p>