<p>这里有很多很好的答案,但是您应该不惜一切代价避免使用<code>shell=True</code>作为<strong>将不受信任的变量传递给子流程这是一种安全风险。变量可以转义到shell并运行任意命令!如果您无法避免,至少使用python3的<code>shlex.quote()</code>来转义字符串(如果您有多个空格分隔的参数,请引用每个拆分,而不是整个字符串)</p>
<p><code>shell=False</code>始终是传递参数数组的默认值</p>
<p>现在,<strong>安全</strong>解决方案</p>
<h2>方法#1</h2>
<p>更改您自己的流程环境-新环境将应用于<strong>python本身和所有子流程。</strong></p>
<pre><code>os.environ['LD_LIBRARY_PATH'] = 'my_path'
command = ['sqsub', '-np', var1, '/homedir/anotherdir/executable']
subprocess.check_call(command)
</code></pre>
<h2>方法#2</h2>
<p>复制环境并将其传递给孩子。您可以完全控制子环境,并且不会影响python自己的环境</p>
<pre><code>myenv = os.environ.copy()
myenv['LD_LIBRARY_PATH'] = 'my_path'
command = ['sqsub', '-np', var1, '/homedir/anotherdir/executable']
subprocess.check_call(command, env=myenv)
</code></pre>
<h2>方法#3</h2>
<p>仅限Unix:执行<code>env</code>以设置环境变量。如果有很多变量需要修改,而不是portabe,那么就更麻烦了,但是像#2一样,您可以完全控制python和子环境</p>
<pre><code>command = ['env', 'LD_LIBRARY_PATH=my_path', 'sqsub', '-np', var1, '/homedir/anotherdir/executable']
subprocess.check_call(command)
</code></pre>
<hr/>
<p>当然,如果<code>var1</code>包含多个空格分隔的参数,它们现在将作为带空格的单个参数传递。要保留<code>shell=True</code>的原始行为,必须组成包含拆分字符串的命令数组:</p>
<pre><code>command = ['sqsub', '-np'] + var1.split() + ['/homedir/anotherdir/executable']
</code></pre>