这是有关this question使用NamedTemporaryFile()的后续步骤

我有一个创建并写入临时文件的函数。然后,我想在另一个函数中使用该文件,该函数调用使用该文件的终端命令(该程序来自Blast +套件blastn)。

def db_cds_to_fna(collection="genes"):  # collection gets data from mongoDB

    tmp_file = NamedTemporaryFile()
    # write stuff to file

    return tmp_file

def blast_all(blast_db, collection="genes"):

    tmp_results = NamedTemporaryFile()
    db_fna = db_cds_to_fna(collection) # should return another file object

    Popen(
        ['blastn',
         '-query', db_fna.name,
         '-db', blast_db,
         '-out', tmp_results.name,
         '-outfmt', '5']  # xml output
    )

    return tmp_results


当我调用blast_all时,我从blastn命令中得到一个错误:

Command line argument error: Argument "query". File is not accessible:  `/var/folders/mv/w3flyjvn7vnbllysvzrf9y480000gn/T/tmpAJVWoz'


但是,就在Popen调用之前,如果我执行os.path.isfile(db_fna.name),则其结果为True。我也可以

print Popen(['head', db_fna.name]).communicate(0)


并且它会正确吐出文件的第一行。因此该文件存在,并且可读。此外,我使用相同的策略从相同的blast +套件(makeblastdb,请参见顶部的问题链接)中调用不同的程序,并且可以正常工作。权限可能有问题吗?如果文件不存在,FWIW blastn返回相同的错误,但是很明显我正确地创建了文件,并且在调用Popen时可读,因此很困惑。

最佳答案

在某些时候,我遇到了非常相似的问题。我一直在寻找年龄,以为自己永远找不到原因。

就我而言,问题是由于文件系统延迟。我想我最终使用time.sleep放置了一个肮脏的hack,以便在开始在子过程中访问它之前给文件系统一些时间来创建临时文件。

希望有帮助!

09-25 17:50