我正在尝试从我的python代码中运行blat搜索。现在它写成......
os.system('blat database.fa fastafile pslfile')
当我运行代码时,我指定“fastafile”和“pslfile”的文件名......
python my_code.py -f new.fasta -p test.psl
这不起作用“fastafile”和“pslfile”是我运行代码时创建和命名的文件的变量,但如果我要使用实际的文件名,我将不得不返回并更改我的代码我跑的时间。我想使用上面的命令行参数来指定文件。
我如何改变这一点,以便每次都用我的参数(new.fasta和test.psl)替换“fastafile”和“pslfile”?
答案 0 :(得分:0)
你应该使用argparse来接受命令行参数(它会给你带有名称f和p的变量来保存文件名),然后从那里形成命令字符串。
command_str = "blat database.fa " + f + " " + p
os.system(command_str)
https://docs.python.org/3.4/library/argparse.html#argparse.ArgumentParser.parse_args
ArgumentParser.parse_args(args=None, namespace=None)
将参数字符串转换为对象,并将它们指定为命名空间的属性。返回填充的命名空间。
以前对add_argument()的调用确切地确定了创建了哪些对象以及如何分配它们。有关详细信息,请参阅add_argument()的文档。
默认情况下,参数字符串取自sys.argv,并为属性创建一个新的空Namespace对象。
答案 1 :(得分:0)
import os
fastaFile = sys.argv[1]
pslFile = sys.argv[2]
os.system("blat -f {0} -p {1}".format(fastaFile,pslFile))
#example run: python scriptName.py fasta.txt psl.txt
答案 2 :(得分:0)
#!/usr/bin/env python2.7
from sys import argv
def main():
if len(argv) != 3:
print "usage: ./my_code.py -f *.fasta -p *.psl"
raise SystemExit
os.system('blat database.fa {} {}'.format(*argv[1:]))
if __name__ == '__main__':
main()
答案 3 :(得分:0)
使用subprocess.call
而不是使用os.system
,它被认为更加pythonic,这消除了从argv清理输入的需要:
subprocess.call(['blat', 'database.fa', '-f', 'new.fasta', '-p', 'test.psl'])
您还可以合并ApolloFortyNine的答案并使用Python的精彩argparse
模块获取参数并将其传递到subprocess.call
。