<p>在POSIX上,参数列表被传递给<code>/bin/sh -c</code>,也就是说,只有第一个参数被识别为一个shell命令,也就是说,shell运行<code>git</code>而没有任何参数,这就是您看到用法信息的原因。如果要使用<code>shell=True</code>,则应将命令作为字符串传递。来自<a href="https://docs.python.org/3/library/subprocess.html#popen-constructor" rel="nofollow">the ^{<cd4>} docs</a>:</p>
<blockquote>
<p>On POSIX with <code>shell=True</code>, the shell defaults to <code>/bin/sh</code>. If <code>args</code> 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 <code>args</code> 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, <code>Popen</code> does the equivalent of:</p>
<pre><code>Popen(['/bin/sh', '-c', args[0], args[1], ...])
</code></pre>
</blockquote>
<p>在这种情况下,您不需要<code>shell=True</code>。在</p>
<pre><code>#!/usr/bin/env python
from subprocess import check_output
merge_base_output = check_output('git merge-base mybranch develop'.split(),
universal_newlines=True).strip()
diff_output = check_output('git diff name-only mybranch'.split() +
[merge_base_output])
</code></pre>