<p>当您指定shell=True时,您将切换到完全不同的行为。从文件中:</p>
<blockquote>
<p>On Unix with shell=True, the shell defaults to /bin/sh. If args is a
string, the string specifies the command to execute through the shell.
This means that the string must be formatted exactly as it would be
when typed at the shell prompt. This includes, for example, quoting or
backslash escaping filenames with spaces in them. If args is a
sequence, the first item specifies the command string, and any
additional items will be treated as additional arguments to the shell
itself. That is to say, Popen does the equivalent of:</p>
<p>Popen(['/bin/sh', '-c', args[0], args[1], ...])</p>
</blockquote>
<p>所以你在运行相当于</p>
<pre><code>/bin/sh -c "adduser" --home=/var/www/myusername/ --gecos GECOS --disabled-login myusername
</code></pre>
<p>您得到的错误消息是当您尝试在没有任何参数的情况下运行<code>adduser</code>,因为所有参数都被传递给<code>sh</code>。在</p>
<p>如果要设置shell=True,则需要这样调用它:</p>
^{pr2}$
<p>或者像这样:</p>
<pre><code>call(['adduser --home=/var/www/myusername/ --gecos GECOS --disabled-login myusername'], shell=True)
</code></pre>
<p>但大多数情况下,您只想使用<code>call</code>而不使用<code>shell=True</code>并使用一系列参数。就像你的第二个,工作,例子。在</p>