可能实际的问题是你正在设置stdout=subprocess.PIPE
但随后忽略输出。如果您想丢弃任何输出,请使用stdout=subprocess.DEVNULL
;如果你想让子进程正常写入标准输出,就不要设置stdout
at all.
无论你使用shell=True
(第一个参数由 shell 解析的单个字符串组成)或不(在这种情况下,第一个参数应该是正确标记化的字符串列表)与是否等待子进程无关。
您通常应该避免Popen
,默认情况下不等待。subprocess.run()
及其遗产表亲check_call()
等人。等待外部子进程。
一般来说,可能会避免shell=True
如果可以的话。
def blast(file):
subprocess.run(
['blastn', '-query,' f'{output_path}fasta_files/{file}',
'-db', db_path, '-max_hsps', '1', '-max_target_seqs', '40',
'-num_threads', '4', '-evalue', '1e-5 ',
'-out', f'{output_path}blast/{file[:-2]}txt',
'-outfmt' "6 qseqid sseqid pident staxids sskingdoms qstart qend "
"qlen length sstart send slen evalue mismatch gapopen "
"bitscore stitle"],
stdout=subprocess.DEVNULL, check=True)
您创建的子进程将被等待,但当然它仍然有可能创建自己的独立子进程,如果子进程向调用者隐藏了这一点,Python 就无法直接等待。
顺便说一句,你的if __name__ == '__main__'
代码应该很简单;如果您将所有有用的代码都放在该块中,则该文件将无法用于import
无论如何,进入另一个脚本,所以整个__name__
检查是没有意义的。这样做的目的是让你可以说
def useful_code():
# lots of code here
if __name__ == '__main__':
useful_code()
现在,如果你python scriptname.py
, then __name__
将__main__
所以打电话给useful_code()
将立即执行。但如果你import scriptname
(假设您已经进行了设置,以便您可以使用正确的方法来执行此操作sys.path
等等)这不会导致useful_code
立即运行;相反,调用者决定是否以及何时真正想要运行此函数(或模块中的其他函数,如果它包含多个函数)。
进一步说,f'{file}'
只是一种非常笨拙的表达方式file
(or str(file)
如果变量还不是字符串)。