BLAST с использованием Python subprocess.call о alignment.def и не знаю, что не так

Вот сценарий, который я пишу.

Два вопроса.

Во-первых, нам нужно распечатать результат взрыва, формируя XML hit_id, hit_len и hit_def. Первые два легко. Но hit.def - это то же самое, что и def. Как этого избежать?

Во-вторых, нам нужно запустить программу на Linux. Эта программа должна принимать две последовательности, одна из которых является белком, а другая - нуклеиновой кислотой, используя необязательный аргумент. Но я просто не могу достичь этой функции.

Это должно работать, когда

$ python my_program.py protein.fa tem.txt prot

последний вариант аргумента. Я не понимаю, почему питон просто не принимает это, когда я пишу

f=sys.argv[3]
f1=str(sys.argv[3])
if f1 is 'prot':
    function(filename,protflag=True)

Python всегда выбирает "другое"

# IMPORT
import sys
import subprocess
################################################################################
# FUNCTIONS
#execute BLAST, vailable type are protein and nuclien

    def run_blast(filename,protflag=True):
    """execute BLAST, vailable type are prot or na"""
        if protflag:
            subprocess.call(['blastp','-query','filename','-db','nr','-outfmt','5','-out','prot.xml'])
        else :
            subprocess.call(['blastn','-query','filename','-db','nt','-outfmt','5','-out','na.xml'])



    def read_XML(filename):
        """return hit_id length hit_def"""
        from Bio.Blast import NCBIXML
        name=str(filename)
        record=NCBIXML.read(open(name))
        for i in range(0,len(record.alignments)):
            hit=record.alignments[i]
            print 'hit_id'+hit.id+'\n'+'length'+hit.len+'\n'+'hit_def'+hit.def+'\n'#here is the problem .def


################################################################################
# MAIN


# write a function for the "main method"


    def main(filename=sys.argv[1],protflag=True):
        """excuate BLAST with file then return the hit_id, length and hit_def"""
        f=sys.argv[3]
        f1=str(f)
        if f is 'prot':
            run_blast(filename,True)
            read_XML("prot.xml")
        elif f is 'na':
            run_blast(filename,False)
            read_XML("prot.xml")
        else:
            print 'only prot and na available'


    if __name__ == '__main__':
        # defaults to reading the system, see above :)
        main()

1 ответ

Предложение "else" всегда выбирается, потому что вы используете "is" вместо "==" для проверки значения sys.argv[3].

От Есть ли разница между `==` и `is` в Python?:

is вернет True, если две переменные указывают на один и тот же объект, == если объекты, на которые ссылаются переменные, равны.

Вы должны использовать

if f1 == 'prot':
Другие вопросы по тегам