*matchfile*" grep: /proj-6ren">
gpt4 book ai didi

文件存在时,linux 中的 Python 子进程找不到文件

转载 作者:太空狗 更新时间:2023-10-29 12:14:45 24 4
gpt4 key购买 nike

这个错误让我抓狂。我的脚本的错误输出:

>>>Run shell cmd "grep -vw ^# *.blastn | awk $1 != $2 > *matchfile*"
grep: /projects/percid100_2/blastn.outfile: No such file or directory
2

我检查了文件,它肯定在那里。

ll /projects/percid100_2/blastn.outfile
-rw-r--r-- 1 users 42633 Apr 17 12:34 /projects/percid100_2/blastn.outfile

上一个函数:

def run_blastn(outdir, outfile):
"""Run blastn under given percent identity """
print ">>> Run blastn"
blastnlog = os.path.join(outdir, 'blastn_db_log')
# make database and run blastn
ref = Popen(['cmd1', '-logfile', blastnlog])
ref.communicate()
blastn = Popen(['cmd2', '-out', outfile], stderr=PIPE)

发生函数错误:

def filter_query(infile, matchfile):
"""Filter out self to self hit and no hit"""
print ">>> Filter query self to self hit and no hit"
print('>>> Run shell cmd "grep -vw ^# *.blastn | awk $1 != $2 > *matchfile*"')
grep = Popen(['grep', '-vw', '^#', infile], stdout=PIPE)
awk = Popen(['awk', '$1 != $2'], stdin=grep.stdout, stdout=PIPE)
output = awk.communicate()[0]
grep.communicate()
if grep.returncode != 0:
print grep.returncode
sys.exit()

with open(matchfile, 'wb') as ofile:
print 'Write to file %s' % matchfile
ofile.write(output)

主要功能:

def main():
parser = get_parser()
args = parser.parse_args()
if not os.path.exists(args.outdir):
os.makedirs(args.outdir)
outdir = os.path.abspath(args.outdir)

bloutfile = 'blastn.outfile'
path_bloutfile = os.path.join(outdir, bloutfile)

# filter query seq outfile name
matchfile = 'match_file'
path_matchfile = os.path.join(outdir, matchfile)

# run blastn
run_blastn(outdir, path_bloutfile)
# filter blastn output gain only matching information
filter_query(path_bloutfile, path_matchfile)

if __name__=='__main__':
main()

其中一个函数输入 infile 是从先前的函数使用 subprocess.Popen 调用另一个程序生成的。

我对这个问题的猜测是之前的命令完成了,不知何故这个子进程调用无法识别之前函数的输出文件。我不知道我应该寻找什么解决方案。

如果我尝试多次运行脚本,脚本最终会成功运行。

但是,这是不行的。

我尝试使用 os.path.abspath(),但没有解决这个问题。

最佳答案

我敢打赌,问题出在您描述但未向我们展示的代码中,该代码运行生成 grep 正在寻找的文件的“上一个命令”。

如果您通过创建 Popen 来运行之前的命令,但随后没有wait,它仍然会在后台运行。如果您启动 grep 太快,文件可能还没有创建。所以你得到了错误。

然后,您需要花几秒钟时间在 shell 中查找文件,到那时,它已经被创建了。所以错误看起来莫名其妙。

或者,如果您运行该程序几次,它最终会成功 — 要么是因为您运气好,要么是因为上一次运行遗留下来的文件被新的运行找到了。

修复可能只是添加一个缺失的 other_command.communicate(),但没有看到其他代码,很难确定。

关于文件存在时,linux 中的 Python 子进程找不到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29708172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com