<p>问题是<code>export</code>只将其变量导出到当前shell的子级。在您通过调用<code>os.system</code>创建的shell中,该shell随后立即退出。在</p>
<p>{1{如果你想让一个最简单的程序都在里面,你可以做一个简单的程序:</p>
<pre><code>os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH; ./mydemo")
</code></pre>
<p>还有一些其他的问题。例如,<code>export</code>在同一个命令中分配一个变量是一个<code>bash</code>-ism,它可能不是所有shell都可用的。使用<a href="https://docs.python.org/3/library/subprocess.html#module-subprocess" rel="nofollow">^{<cd6>}</a>您可以指定一个特定的shell,但是使用<code>system</code>您只需要得到操作系统认为Linux上默认的shell,<a href="http://linux.die.net/man/3/system" rel="nofollow">manpage</a>表示这意味着<code>/bin/sh -c</code>。在</p>
<p>实际上,解决这个问题的最好方法就是不要在一开始就使用shell,而是按照您想要的方式设置环境变量。这正是<a href="https://docs.python.org/3/library/os.html#os.system" rel="nofollow">^{<cd2>}</a>文档所说的原因:“<code>subprocess</code>模块为生成新进程和检索其结果提供了更强大的工具;使用该模块比使用此函数更可取。”例如:</p>
^{pr2}$
<p>或者,如果您想真正安全(与shell代码不同):</p>
<pre><code>LD_LIBRARY_PATH = env.get('LD_LIBRARY_PATH', '')
if LD_LIBRARY_PATH:
LD_LIBRARY_PATH = ':' + LD_LIBRARY_PATH
LD_LIBRARY_PATH = shlex.quote(os.getcwd()) + LD_LIBRARY_PATH
subprocess.check_call(['./mydemo'], env=env)
</code></pre>
<p>我已经把它写得比你通常写的更明确、更详细,以使步骤更明显:不要在空路径之前包含一个尾随<code>:</code>,并使用<code>shlex.quote</code>,以防有人对当前工作目录做了一些棘手的事情。在</p>