为什么 SublimeREPL 不会导入 Python 模块或读取 CWD 中的文件?

Why SublimeREPL won't import a Python module or read a file in CWD?

我在 Ubuntu Zesty 上使用 Sublime Text 3 build 3126 和 SublimeREPL插件。

我用 CTRL+SHIFT+P 打开一个 Python REPL >> SublimeREPL: Python 和使用 CTRL+, , F 将文件发送到 REPL,只要我处理单个 Python 脚本文件,一切都会正常进行。一旦我尝试将代码的某些部分移动到另一个模块并将其导入到主文件中,我就会得到令人讨厌的 ImportError: No module named错误。

正在尝试打开位于同一目录中的文本文件:

codecs.open('filename', encoding='utf-8')

结果:

 IOError: [Errno 2] No such file or directory: 'filename'

我花了一整天的时间试图找到解决这个问题的办法。

首先我认为 $PYTHONPATH 有问题。我遵循了 SublimeREPL GitHub 页面上这个 (closed) 问题中给出的线索:https://github.com/wuub/SublimeREPL/issues/355

虽然插件作者给出的解决方案不起作用,但将包含我工作目录路径的 PYTHONPATH 变量添加到 extend_env Packages/SublimeREPL/config/Python/Main.sublime-menu 中的键解决了导入失败的问题。

我以为我是金子,然后我尝试读取 Python 中的文本文件并得到 IOError。然后我终于明白错误的 CWD(当前工作目录)是罪魁祸首。

如 Python 文档所述:

"When a module named spam is imported, the interpreter first searches for a built-in module with that name. If not found, it then searches for a file named spam.py in a list of directories given by the variable sys.path. sys.path is initialized from these locations:

  • the directory containing the input script (or the current directory).
  • PYTHONPATH (a list of directory names, with the same syntax as the
  • shell variable PATH). the installation-dependent default.

我在 REPL promt 中尝试了 import osprint os.getcwd() 并且肯定是我得到的是:

/opt/sublime_text/

那我做了什么?解决方案是对 Packages/SublimeREPL/config/Python/Main.sublime-menu 中的一行进行简单更改(在与我使用的 REPL 对应的部分中)。来自:

"cwd": "$file_path",

至:

"cwd": "$folder",

现在调用 os.getcwd() 得到了一个指向包含我发送给 SublimeREPL 的文件的目录的路径,一切正常。为什么 $file_path 给出 '/opt/sublime_text' 而不是文件路径是插件作者的问题或者我的系统有一些潜在的怪癖。

您是否调查过您打开 SublimeREPL: Python 的 file/panel 与 print os.getcwd() 的输出之间是否存在关系? SublimeREPL 在 REPL 启动时初始化它的 cwd。 cwd 将在 REPL 的整个生命周期内保留。

正如您所指出的,SublimeREPL 的默认 cwd:Python 是:

"cwd": "$file_path"

这意味着开始 SublimeREPL: Python 并且你的光标在一个空白的 Sublime 面板中,结果是 /opt/sublime_text/ 作为 cwd。这可能被认为是不受欢迎和令人困惑的。

但是,如果您启动 SublimeREPL: Python 而您的光标位于您想要 运行 的 .py 文件中,REPL 将使用当前 .py 文件的文件夹 作为其 cwd。

我个人认为这是理想的行为,但在它变得方便之前您必须了解它。

如果将 cwd 的设置更改为:

"cwd": "$folder",

在您不使用 sublime-projects 的情况下,上述行为保持不变。当您使用 sublime-project 时,python REPL cwd 将成为主项目文件夹,与 REPL 启动时的光标位置无关。如果您有一个 python 驱动的项目,这可能是所需的行为。但是,如果您只是在一个更大的项目中使用一些 python 脚本,您可能不希望您的主项目文件夹成为 python REPL 中的 cwd。