擅长:python、mysql、java
<p>我想我找到了导致这种行为的原因。首先,<code>Popen()</code>函数通常不会等到外部命令完成后再继续处理它。第二,因为正如用户glibdud在我的另一个问题中提到的<a href="https://stackoverflow.com/a/35228682/3742902">in his answer</a>,<code>NamedTemporaryFile</code>的作用与{a2}相似</p>
<blockquote>
<p>It will be destroyed as soon as it is closed (including an implicit close when the object is garbage collected).</p>
</blockquote>
<p>由于我的<code>blast_all()</code>函数的结尾不返回<code>query</code>临时文件,因此在运行外部<code>blastn</code>命令时,该文件将被关闭并被垃圾回收,因此该文件被删除。我猜外部<code>head</code>命令执行得很快,不会遇到这个问题,但是<code>blastn</code>可能需要几分钟才能运行。在</p>
<p>因此,解决方案是强制<code>Popen()</code>等待:</p>
<pre><code>Popen(
['blastn',
'-query', db_fna.name,
'-db', blast_db,
'-out', tmp_results.name,
'-outfmt', '5'] # xml output
).wait()
</code></pre>