用Python的Popen替代Bash风格的流程

用Python的Popen替代Bash风格的流程,第1张

用Python的Popen替代Bash风格的流程

如果将约定

pram_axdnull
理解
"-"
为:“从stdin中读取”,则可以:

p = Popen(["pram_axdnull", str(kmer), input_filename, "-"],          stdin=PIPE, stdout=PIPE)output = p.communicate(generate_kmers(3))[0]

如果输入是由外部过程生成的:

kmer_proc = Popen(["generate_kmers", str(kmer)], stdout=PIPE)p = Popen(["pram_axdnull", str(kmer), input_filename, "-"],          stdin=kmer_proc.stdout, stdout=PIPE)kmer_proc.stdout.close()output = p.communicate()[0]

如果

pram_axdnull
明白
"-"
的约定:

import osimport tempfilefrom subprocess import check_outputwith tempfile.NamedTemporaryFile() as file:    file.write(generate_kmers(3))    file.delete = Falsetry:    p = Popen(["pram_axdnull", str(kmer), input_filename, file.name],   stdout=PIPE)    output = p.communicate()[0]    # or    # output = check_output(["pram_axdnull", str(kmer), input_filename,        file.name])finally:    os.remove(file.name)

要使用外部过程生成临时文件:

from subprocess import check_callwith tempfile.NamedTemporaryFile() as file:    check_call(["generate_kmers", str(kmer)], stdout=file)    file.delete = False

为了避免等待所有kmers生成,即同时写入/读取kmers,可以

os.mkfifo()
在Unix上使用(由@cdarke建议):

import osimport shutilimport tempfilefrom contextlib import contextmanagerfrom subprocess import Popen, PIPE@contextmanagerdef named_pipe():    dirname = tempfile.mkdtemp()    try:        path = os.path.join(dirname, 'named_pipe')        os.mkfifo(path)        yield path    finally:        shutil.rmtree(dirname)with named_pipe() as path:    p = Popen(["pram_axdnull", str(kmer), input_filename, path],   stdout=PIPE) # read from path    with open(path, 'wb') as wpipe:        kmer_proc = Popen(["generate_kmers", str(kmer)],    stdout=wpipe) # write to path    output = p.communicate()[0]    kmer_proc.wait()


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5673212.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存