簡體   English   中英

subprocess.call運行Mafft

[英]subprocess.call to run mafft

我寫了一個腳本從終端運行mafft模塊:

 import subprocess


def linsi_MSA(sequnces_file_path):
    cmd = ' mafft --maxiterate 1000 --localpair {seqs} > {out}'.format(seqs=sequnces_file_path, out=sequnces_file_path)
    subprocess.call(cmd.split(), shell=True)

if __name__ == '__main__':
    import logging
    logger = logging.getLogger('main')
    from sys import argv
    if len(argv) < 2:
        logger.error('Usage: MSA <sequnces_file_path> ')
        exit()
    else:
        linsi_MSA(*argv[1:])

由於某些原因,當嘗試使用以下命令從終端運行腳本時:

python ./MSA.py ./sample.fa

我直接在終端打開了mafft交互式版本(要求輸入..output等。)

當我嘗試使用以下命令直接在終端中編寫cmd時:

mafft --maxiterate 1000 --localpair sample.fa > sample.fa 

它可以按預期方式工作,並且無需打開交互式版本即可執行命令行版本。

我希望我的腳本能夠在終端上執行cmd行版本。 似乎是什么問題?

謝謝!

如果使用shell=True ,則應傳遞一個字符串作為參數,而不是列表,例如:

subprocess.call("ls > outfile", shell=True)

在文檔中沒有對此進行解釋,但是我懷疑它與最終調用的底層庫函數有關:

call(["ls", "-l"]) --> execlp("ls", "-l")

      ^^^^^^^^^^              ^^^^^^^^^^
call("ls -l", shell=True) --> execlp("sh", "-c", "ls -l")
     ^^^^^^^                                     ^^^^^^^ 

call(["ls", "-l"], shell=True) --> execlp("sh", "-c", "ls", "-l")

# which can be tried from command line:
sh -c ls -l
# result is a list of files without details, -l was ignored.
# see sh(1) man page for -c string syntax and what happens to further arguments.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM