首页 > 解决方案 > 2 通过 python 的命令行和 "if __name__ == "__main__":" 输入

问题描述

关于我做错了什么的任何想法?

我正在使用以下代码:

            else:
                stack_queue.append((next, edge + [next]))

if __name__ == "__main__":
    print(list(breath_first_search(graph, 'J', 'A')))

它在 Spyder 控制台上打印 "[['J', 'I', 'H', 'C', 'A']]"

我想通过 cmd 运行它。我这样做:

python C:\XX\XX-first-search.py

它也给了我正确的结果。

现在,我想将其更改为从 cmd 接收 2 个输入字母。我试过了:

if __name__ == "__main__":
    print(list(breath_first_search(graph, sys.argv[0], sys.argv[1])))

它给了我错误: 我第一次尝试的错误

我也试过:

if __name__ == "__main__":
    print(list(breath_first_search(graph, sys.argv, sys.argv)))

在此处输入图像描述

如果你需要,我的整个代码:

import sys

graph = {'A': set(['B', 'C']),
         'B': set(['A', 'D', 'E']),
         'C': set(['A', 'G', 'H']),
         'D': set(['B']),
         'E': set(['B', 'F']),
         'F': set(['E']),
         'G': set(['C']),
         'H': set(['C','I']),
         'I': set(['H', 'J']),
         'J': set(['I'])}


def breath_first_search(graph, initial_node, final_node):
    stack_queue = [(initial_node, [initial_node])]  # List; initial node is the initial node; creates a list 

    while stack_queue:
        (node, edge) = stack_queue.pop(0)

        for next in graph[node] - set(edge):

            if next == final_node:
                yield edge + [next]

            else:
                stack_queue.append((next, edge + [next]))

if __name__ == "__main__":
    print(list(breath_first_search(graph, sys.argv, sys.argv)))

标签: python

解决方案


sys.argv[doc]是传递给程序的参数列表,包括程序本身作为第一个参数(sys.argv[0]程序名称也是如此)。

因此,我们可以使用sys.argv[1]andsys.argv[2]传递两个额外的参数:

if __name__ == "__main__":
    print(list(breath_first_search(graph, sys.argv[1], sys.argv[2])))

或者我们可以先做一些适当的检查和序列解包,让它更优雅:

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print('Program requires two parameters')
        sys.exit(1)
    __, a, b = sys.argv
    print(list(breath_first_search(graph, a, b)))

推荐阅读