SublimeREPL返回无用的错误,在IDLE中起作用

时间:2013-11-24 06:11:59

标签: python sublimetext2 sublimerepl

我正在使用Sublime Text 2,Package Control和SublimeREPL来(尝试)创建和运行python代码。代码是一个简单的Brainfuck解释器,如下所示。然而,这不是问题:

import sys

def brainfuck(arg_bf_string):

    bf_string = arg_bf_string
    bf_string_pointer = 0

    value_array = [0] * 65536
    value_array_pointer = 0

    running = True
    while running:

        if bf_string[bf_string_pointer] == ">":
            value_array_pointer += 1

        if bf_string[bf_string_pointer] == "<":
            value_array_pointer -= 1

        if bf_string[bf_string_pointer] == "+":
            value_array[value_array_pointer] += 1

        if bf_string[bf_string_pointer] == "-":
            value_array[value_array_pointer] -= 1

        if bf_string[bf_string_pointer] == ".":
            sys.stdout.write(chr(value_array[value_array_pointer]))

        if bf_string[bf_string_pointer] == ",":
            value_array[value_array_pointer] = ord(raw_input("INP "))

        if bf_string[bf_string_pointer] == "[":
            if value_array[value_array_pointer] == 0:

                loop_depth = 0
                loop_pointer = bf_string_pointer + 1
                loop_searching = True

                while loop_searching:
                    if bf_string[loop_pointer] == "[":
                        loop_depth += 1

                    elif bf_string[loop_pointer] == "]" and loop_depth > 0:
                        loop_depth -= 1

                    elif bf_string[loop_pointer] == "]" and loop_depth == 0:
                        bf_string_pointer = loop_pointer
                        loop_searching = False

                    loop_pointer += 1

        if bf_string[bf_string_pointer] == "]":
            if value_array[value_array_pointer] != 0:

                loop_depth = 0
                loop_pointer = bf_string_pointer - 1
                loop_searching = True

                while loop_searching:
                    if bf_string[loop_pointer] == "]":
                        loop_depth += 1

                    elif bf_string[loop_pointer] == "[" and loop_depth > 0:
                        loop_depth -= 1

                    elif bf_string[loop_pointer] == "[" and loop_depth == 0:
                        bf_string_pointer = loop_pointer
                        loop_searching = False

                    loop_pointer -= 1

        bf_string_pointer += 1
        if bf_string_pointer > len(bf_string)-1:
            running = False

def main():
    brainfuck(raw_input("BF "))

我成功地在IDLE中运行了这段代码,所以我确信代码本身不是问题。

使用SublimeREPL运行时,我收到以下错误:

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32
             ^

我不知道那是从哪里来的。我可以通过简单地将文件加载到Sublime Text,然后选择Tools&gt;来复制它。 SublimeREPL&gt; REPL中的Eval&gt;文件。

我尝试过工具&gt; SublimeREPL&gt; Python&gt; Python - 运行当前文件。执行此操作时,我在REPL选项卡中收到以下内容:

C:\Python27\python.EXE: can't open file '$file_basename': [Errno 2] No such file or directory

***Repl Closed***

我可以输入提示,但它完全没有响应。我猜想我的Python安装有问题。我不知道该怎么做或者如何解决它,或者是否是我甚至应该担心的事情。

据我所知,我已正确安装SublimeREPL,使用Package Control并将SublimeREPL设置从Settings - Default复制到Settings - User。我已经尝试重新安装我的Python安装。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

你遗漏了一些关键程序 - 一种运行它的方法。传统上,它由文件末尾的以下内容组成:

if __name__ == '__main__':
    main()

与C程序不同,例如,仅定义main()函数并不意味着它将在文件运行时执行 - 它需要显式调用。

一旦我将这些行添加到程序中,我就可以执行以下Hello World程序(来自维基百科):

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

运行Tools -> SublimeREPL -> Python -> Python - RUN Current File。如果您想更多地与程序交互,请首先确保打开Python REPL,然后选择Tools -> SublimeREPL -> Eval in REPL -> File。这会将brainfuck()main()函数加载到内存中,因此如果您愿意,可以多次运行它们。