如何在终端中执行main方法?

时间:2015-07-18 19:51:22

标签: python terminal

我有一个带有类定义,方法定义的Python程序,最后是一个调用这些方法和类的main方法。当我在终端中运行程序时,它没有输出任何内容,没有错误消息。我应该改变程序的编写方式吗?

主要方法位于底部。

import re
import random

class node:
    def __init__(self, parent, daughters, edge):
        self.parent = parent
        self.daughters = daughters
        self.edge = edge
        trie.append(self)
        self.index = len(trie) - 1

def BruteForcePatternMatching(text, patterns):
    indices = []
    for pattern in patterns:
        pattern = re.compile(pattern)
        indices += pattern.finditer(text)
    return indices

def TrieConstruction(patterns, trie):
    trie.append(node(0, [], 0))
    for pattern in patterns:
        currentNode = trie[0]
        for base in pattern:
            for daughter in currentNode.daughters:
                if base == daughter.edge:
                    currentNode = daughter
                    break
            else:
                trie.append(node(currentNode, [], base))
                currentNode = trie[-1]

def PrefixTrieMatching(text, trie):
    v = trie[0]
    for index, base in enumerate(text):
        if v.daughters == []:
            pattern_out = []
            climb(v.index)
            return ''.join(pattern_out)
        else:
            for daughter in v.daughters:
                if base == daughter.edge:
                    v = daughter
                    break
            else:
                print('No matches found.')
                return

def climb(index):
    if index == 0:
        return
    else:
        pattern_out.append(node.edge)
        climb(trie[index].parent)

def TrieMatching(text, trie):
    while not text == []:
        PrefixTrieMatching(text, trie)
        text = text[:-1]

def SuffixTrieConstruction(text):
    trie = [node(0, [1], 0), node(0, [], len(text) + 1)] #we use normal nodes, but if they are leaves, we give them integers for indices

    for index in range(len(text)): 
        start = len(text) - index
        slide = text[start:-1]
        currentNode = trie[0]

        for symbol in slide:
            for daughter in currentNode.daughters:
                if symbol == daughter.edge:
                    currentNode = daughter
                    break
            else:
                trie.append(node(currentNode.index, [], symbol)) 
                currentNode = trie[-1]

            if symbol == slide[-1]:
                trie.append(node(currentNode.index, [], start))

    return trie

def SuffixTreeConstruction(trie):
    for node in trie:
        if len(node.daughters) == 1:
            node.edge = node.edge + trie[node.daughter[0]].edge
            trie[node.daughters[0]].parent = node.index
            node.daughters = trie[currentNode.daughters[0]].daughters
            del trie[node.daughter[0]]

    for node in trie:
        for daughter in node.daughters:
            print('(%d, %d, %s') % (node.index, daughter, node.edge)


def main():

    print('First, we open a file of DNA sequences and generate a random DNA string of length 3000, representative of the reference genome.')

    patterns = list(open('patterns'))
    text = ''
    for count in range(3000):
        text += choice('ACTG')

    print('We will first check for matches using the Brute Force matching method, which scans the text for matches of each pattern.')
    BruteForcePatternMatching(text, patterns)
    print('It returns the indices in the text where matches occur.')
    print('Next, we generate a trie with the patterns, and then run the text over the trie to search for matches.')
    trie = []
    TrieConstruction(patterns, trie)
    TrieMatching(text, trie)
    print('It returns all matched patterns.')
    print('Finally, we can construct a suffix tree from the text. This is the concatenation of all non-branching nodes into a single node.')
    SuffixTreeConstruction(SuffixTrieConstruction(text))
    print('It returns the adjacency list - (parent, daughter, edge).')

3 个答案:

答案 0 :(得分:1)

只需在结尾处调用主要功能

main()
  • 在这种情况下,只要程序运行,该函数就会运行。

您可以使用

if __name__ == "__main__": main()
  • 仅运行该文件(/执行模块)

答案 1 :(得分:1)

如NightShadeQueen和Chief所述。

使用

if __name__ == "__main__":
    main()

在程序结束时。这样,程序可以从命令行运行,并且可以导入程序中定义的所有函数,而无需执行main()

有关__name__及其用途的更详细说明,请参阅this帖子。

Here是一个StackOverflow帖子,详细介绍了您可以用此做的一些事情,并以许多不同的词语重述原始解释,以供您休闲。

答案 2 :(得分:1)

假设您的代码保存在myfile.py

您可以像其他人所说的那样添加:

if __name__ == "__main__":
    main()

在您的文件末尾,并使用python myfile.py运行。

但是,如果由于某些不明原因,您无法修改文件的内容,您仍然可以通过以下方式实现此目的:

python -c "import myfile; myfile.main()"
从命令行

。 (只要从包含myfile

的目录中运行它