<p>使用Python运行stuff的规范方法是使用<code>subprocess</code>模块,但是它有很多函数神秘地称为<code>check_call</code>或{<cd3>},这些函数往往有一些神秘的警告,比如“不要将stdout=PIPE或stderr=PIPE与此函数一起使用”,因此让我再提供一些:</p>
<h3>步骤1:运行脚本</h3>
<pre><code>proc = subprocess.Popen(["your_command", "parameter1", "paramter2"],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
</code></pre>
<p>现在该进程正在后台运行,并且您有了对它的引用。在</p>
<p>编辑:我差点忘了——如果您想稍后检索输出,您必须告诉Python为标准输出创建读取管道。如果不执行此步骤,stdout和stderr将只转到程序的标准输出和标准错误,<code>communicate</code>将不会在步骤2中获取它们。在</p>
<h3>步骤2:等待进程完成并获得其输出</h3>
^{pr2}$
<p><a href="https://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate" rel="nofollow noreferrer">^{<cd4>}</a>还允许您执行更多操作:</p>
<ul>
<li>将stdin数据传递给进程(<code>input=</code>参数)</li>
<li>指定进程完成的时间限制,以避免挂起(<code>timeout=</code>参数)</li>
</ul>
<p>确保还捕获并正确处理来自<a href="https://docs.python.org/3/library/subprocess.html#popen-constructor" rel="nofollow noreferrer">^{<cd8>}</a>或{a1}的任何异常。在</p>
<hr/>
<p>如果您不关心旧的Python,有一种更简单的方法,称为<a href="https://docs.python.org/3/library/subprocess.html#subprocess.run" rel="nofollow noreferrer">^{<cd10>}</a>来完成这一切:</p>
<pre><code>completed_process = subprocess.run(
['your_command', 'parameter'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# this starts the process, waits for it to finish, and gives you...
completed_process.returncode
completed_process.stdout
completed_process.stderr
</code></pre>
<p>对于错误检查,您可以调用<code>completed_process.check_returncode()</code>,或者只将<code>check=True</code>作为<code>run</code>的附加参数传递。在</p>