擅长:python、mysql、java
<p><code>noWinConsole</code>只是一个包装器,它只需要一个参数,<code>program</code>。因此,当您给它两个参数(<code>program</code>作为第一个位置参数,然后是用于<code>subprocess</code>调用的关键字参数<code>stdout</code>)时,它会变得异常。在</p>
<p>幸运的是,有一个标准的习惯用法可以生成一个包装器,它将任何一组参数传递给一个内部函数。它使用<a href="http://docs.python.org/3/tutorial/controlflow.html#arbitrary-argument-lists" rel="nofollow noreferrer">^{<cd6>}</a>和<a href="https://stackoverflow.com/a/1769475/2069350">^{<cd7>}</a>符号来打包/解包参数。在</p>
<pre><code>def noWinConsole(*args, **kwargs):
# Other stuff here as needed
subprocess.call(*args, **kwargs)
</code></pre>
<p>基本上就是这样。函数定义中的<code>*</code>运算符接受所有输入的位置参数,并将它们打包到一个名为<code>args</code>的元组中。然后,当您调用<code>subprocess</code>,<code>*</code>运算符<em>将该元组解包,并以相同的顺序将这些相同的参数传递给下一个函数。在</p>
<p><code>**</code>运算符的工作原理基本相同,只是它捕捉像<code>stdout='foo.txt'</code>这样的关键字参数并将它们全部打包到一个像<code>{'stdout':'foo.txt'}</code>这样的字典中。然后,当您在调用内部函数中再次使用<code>**</code>时,该字典将被解包并转换回关键字参数。在</p>