擅长:python、mysql、java
<p>您看到的错误是因为您正在使用<code>os.popen()</code>运行该命令,这意味着管道已打开并连接到该命令的<code>stdout</code>。每当命令(或者它执行的任何东西没有重定向<code>stdout</code>)想要写入<code>stdout</code>,它就会尝试写入管道。但是您不需要保留管道,因为您不在任何地方分配<code>os.popen()</code>的结果,所以它被Python清理并关闭。因此,试图向其写入的进程遇到一个断管,并产生您看到的错误。(<code>os.popen()</code>没有将<code>stderr</code>重定向到管道,因此仍然可以看到错误。)</p>
<p>在您的<code>os.popen()</code>调用中的另一个问题是,您没有检查以确保<code>directory</code>不包含任何特定于shell的字符。例如,如果目录包含引号或*,可能会发生奇怪的事情。像这样使用<code>os.popen()</code>相当糟糕。</p>
<p>您应该改用<code>subprocess.Popen()</code>,并显式地告诉它您想对进程的输出(stdout和stderr)做些什么。您传递<code>subprocess.Popen()</code>一个参数列表(包括您想启动的东西)而不是一个字符串,它完全避免了shell——不需要检查字符串。如果您真的想忽略输出,可以使用以下方法:</p>
<pre><code>devnull = open(os.devnull, 'w')
for directory in directories:
subprocess.Popen(['runtool_exec', directory], stdout=devnull)
</code></pre>
<p>尽管我强烈建议至少对subprocess.Popen的结果进行一些初步检查,看看该进程是否过早执行或错误代码。</p>