我的函数run_deinterleave()是从文件deinterleave.sh复制代码,然后用用户输入的文件名替换占位符(sra_data),然后在命令行上运行它。
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)。
#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发布于 2021-04-25 09:13:10
如错误消息所示,代码由/bin/sh解释;如果执行
/bin/sh Project/CODE/deinterleave.sh,您将得到相同的错误,因为过程替代 >(…)是/bin/sh所不理解的Bash扩展。
此外,由于您不与shell代码通信,所以我们根本不需要管道。因此,我不使用os.popen,而是使用subprocess.run,它允许指定Bash作为shell。
subprocess.run(codex, shell=True, executable="bash")发布于 2021-04-25 10:38:01
绝对最好的解决方法可能是用本机Python代码替换shell脚本;但是如果没有规范和/或示例输入,我认为我们无法确切地告诉您如何做到这一点。
一个直接和简单的修复是更改deinterlace,以便它接受一个输入文件参数。
#!/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代码就可以简化为
subprocess.run(
['Project/CODE/deinterleave', inp_address],
# probably a good idea
check=True)虽然我不完全理解周围函数的其余部分,所以还不清楚如何确切地重写它。
我认为shell脚本可以被重新实现,比如
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())https://stackoverflow.com/questions/67251034
复制相似问题