从Python

时间:2015-08-04 15:34:19

标签: python command-line

我正在尝试从我的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”?

4 个答案:

答案 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