首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过python发出解析shell程序

通过python发出解析shell程序
EN

Stack Overflow用户
提问于 2021-04-25 07:55:47
回答 2查看 43关注 0票数 0

我的函数run_deinterleave()是从文件deinterleave.sh复制代码,然后用用户输入的文件名替换占位符(sra_data),然后在命令行上运行它。

代码语言:javascript
复制
def  run_deinterleave():
   codes = open('Project/CODE/deinterleave.sh')     
   codex = codes.read()
   print(inp_address)
   codex = codex.replace('sra_data', inp_address)
   #is opening this twice creating another pipeline?
   stream = os.popen(codex)
   codes.close()
   
   self.txtarea.insert(END,codex)    
#stuff

但是,我一直收到这样的错误:

/bin/sh: 5:语法错误:"(“意外”

deinterleave.sh中的代码工作得很好,产生了两个单独的文件,给出了交错成对的端sra_file (我认为是来自基因测序机器的输出文件:P)。

代码语言:javascript
复制
#1deinterleave paired end fastq file 
 paste - - - - - - - - < sra_data \
| tee >(cut -f 1-4 | tr "\t" "\n" > /home/lols/Project/reads-1.fq) \
| cut -f 5-8 | tr "\t" "\n" > /home/lols/Project/reads-2.fq
EN

回答 2

Stack Overflow用户

发布于 2021-04-25 09:13:10

如错误消息所示,代码由/bin/sh解释;如果执行

/bin/sh Project/CODE/deinterleave.sh,您将得到相同的错误,因为过程替代 >(…)是/bin/sh所不理解的Bash扩展。

此外,由于您不与shell代码通信,所以我们根本不需要管道。因此,我不使用os.popen,而是使用subprocess.run,它允许指定Bash作为shell。

代码语言:javascript
复制
   subprocess.run(codex, shell=True, executable="bash")
票数 0
EN

Stack Overflow用户

发布于 2021-04-25 10:38:01

绝对最好的解决方法可能是用本机Python代码替换shell脚本;但是如果没有规范和/或示例输入,我认为我们无法确切地告诉您如何做到这一点。

一个直接和简单的修复是更改deinterlace,以便它接受一个输入文件参数。

代码语言:javascript
复制
#!/usr/bin/env bash
paste - - - - - - - - < "${1-sra_data}" |
tee >(cut -f 1-4 | tr "\t" "\n" > "${2-/home/lols/Project/reads-1.fq}") |
cut -f 5-8 | tr "\t" "\n" > "${3-/home/lols/Project/reads-2.fq}"

这种重构还允许您将输出文件的名称指定为第二和第三命令行参数。

另外,Bash脚本实际上不应该有.sh扩展,所以可能会删除它。

在shebang行中明确命名Bash应该可以解决在sh中运行Bash代码时得到的错误消息;也可以参见sh和bash的区别

这样,您的Python代码就可以简化为

代码语言:javascript
复制
subprocess.run(
    ['Project/CODE/deinterleave', inp_address],
    # probably a good idea
    check=True)

虽然我不完全理解周围函数的其余部分,所以还不清楚如何确切地重写它。

我认为shell脚本可以被重新实现,比如

代码语言:javascript
复制
with open(inp_address, 'r') as sra_data, open(
    '/home/lols/Project/reads-1.fq', 'w') as first, open(
        '/home/lols/Project/reads-2.fq', 'w') as second:
    for idx in range(4):
        first.write(sra_data.readline())
    for idx in range(4):
        second.write(sra_data.readline())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67251034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档