streamlit的参考资料
https://docs.streamlit.io/library/get-started/create-an-app
st.button https://docs.streamlit.io/library/api-reference/widgets/st.button
st.text_area https://docs.streamlit.io/library/api-reference/widgets/st.text_area
python io https://docs.python.org/3/library/io.html
io.StringIO
主要作用 python subprocess 调用blastn,blastn输出结果不保存到文件里,而是输出到屏幕,输出到屏幕的内容需要用io.StringIO转化一下才能被NCBIXML解析
https://janakiev.com/blog/python-shell-commands/
这个链接主要介绍的是python subprocess 调用blastn,blastn输出结果不保存到文件里,而是输出到屏幕 ,然后如何将输出到屏幕的内容保存到一个python 对象里
https://stackabuse.com/the-python-tempfile-module/
这个链接主要介绍了如何生成临时文件(用于存储用户上传的fasta文件)
https://stackoverflow.com/questions/23212435/permission-denied-to-write-to-my-temporary-file
临时文件写入内容的时候不知道为啥总是提示没有权限,这个链接里稍微有点介绍
st.datatable https://docs.streamlit.io/1.3.0/library/api-reference/data/st.dataframe
https://www.metagenomics.wiki/tools/blast/blastn-output-format-6
blastn output format 6 的表头
st.file_uploader https://docs.streamlit.io/library/api-reference/widgets/st.file_uploader
完整代码
(还很不完善,只是勉强可以运行)
代码语言:javascript复制import streamlit as st
import tempfile
import os
import io
from Bio import SeqIO
import subprocess
from Bio.Blast import NCBIXML
import pandas as pd
st.title("Learn how to build web blast app using streamlit")
# abc = st.text_area(label="paste your fasta here",
# value=">seq1nATCGA",
# height=200)
# #print(abc)
# if st.button('save'):
# # for line in abc:
# # st.write(line)
# with open('abc.txt','w') as fw:
# fw.write(abc)
# st.write("OK")
# result = st.button("Click Here")
#
# # st.write(result)
# print(os.getcwd())
# if result:
# with tempfile.TemporaryFile() as fp:
# tmp = tempfile.NamedTemporaryFile(suffix=".fasta",delete=False)
# st.write(tmp.name)
# tmp.write(bytes(abc,'utf-8'))
# tmp.seek(0)
# with open(tmp.name,'r') as fr:
# for line in fr:
# st.write(line)
# #os.write(new_file,b'abcde')
# #st.write("OK")
# #os.close(new_file)
# # with open(tmp.name,'w') as fw:
# # fw.write(abc)
# st.write(":smile:")
# you need to change this path to you own
blastn = "D:/Biotools/blast/ncbiblast/bin/blastn"
db = 'D:/Bioinformatics_Intro/streamlit/uploadfiles/blastdb/cpvirus'
tempfile.tempdir = "D:/Bioinformatics_Intro/streamlit/uploadfiles/temp"
fasta = st.text_area(label="you can paste your fasta here",
value=">seq1nATCGA",
height=400)
runblastn = st.button("run blastn")
names = "qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore".split()
if runblastn:
tmp = tempfile.NamedTemporaryFile(suffix=".fasta",delete=False)
st.write(tmp.name)
tmp.write(bytes(fasta,'utf-8'))
tmp.seek(0)
for rec in SeqIO.parse(tmp.name,'fasta'):
st.write(rec.id)
cmd = [blastn,'-db',db,'-query',tmp.name,'-evalue','0.0001','-outfmt','6']
process = subprocess.Popen(cmd,stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True)
stdout,stderr = process.communicate()
# for record in NCBIXML.parse(io.StringIO(stdout)):
# st.write(record.query)
df = pd.read_csv(io.StringIO(stdout),sep="t",header=None,names=names)
st.dataframe(df)
tmp.close()
os.unlink(tmp.name)
uploaded_file = st.file_uploader("or upload your fasta file here")
if uploaded_file is not None:
bytes_data = uploaded_file.getvalue()
#print(type(bytes_data))
#st.write(bytes_data)
tmp = tempfile.NamedTemporaryFile(suffix=".fasta",delete=False)
st.write(tmp.name)
try:
tmp.write(bytes_data)
tmp.seek(0)
with open(tmp.name,'r') as fr:
for line in fr:
if line.startswith(">"):
st.write("input seq id is: %s"%(line.strip().replace(">","")))
cmd = [blastn,'-db',db,'-query',tmp.name,'-evalue','0.0001','-outfmt','6']
process = subprocess.Popen(cmd,stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True)
stdout,stderr = process.communicate()
# for record in NCBIXML.parse(io.StringIO(stdout)):
# st.write(record.query)
df = pd.read_csv(io.StringIO(stdout),sep="t",header=None,names=names)
st.dataframe(df)
finally:
tmp.close()
os.unlink(tmp.name)
运行代码
代码语言:javascript复制streamlit run main.py
如何部署呢?
在查资料吧