【问题标题】:Why SublimeREPL won't import a Python module or read a file in CWD?为什么 SublimeREPL 不会导入 Python 模块或读取 CWD 中的文件?
【发布时间】:2017-12-18 01:35:28
【问题描述】:

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

我用 CTRL+SHIFT+P >> SublimeREPL: Python 打开一个 Python REPL,然后用 CTRL+, , F 向 REPL 发送一个文件> 只要我处理单个 Python 脚本文件,evertyhing 就可以工作。当我尝试将代码的某些部分移动到另一个模块并将其导入主文件时,我会收到讨厌的 ImportError: No module named 错误。 p>

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

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

结果:

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

【问题讨论】:

    标签: python sublimetext3 sublimerepl


    【解决方案1】:

    我花了一整天时间扯头发,试图找到解决这个问题的方法。

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

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

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

    按照 Python 文档的说明:

    "当一个名为 spam 的模块被导入时,解释器首先搜索 对于具有该名称的内置模块。如果没有找到,然后搜索 对于一个名为 spam.py 的文件,在由 变量 sys.path。 sys.path 从这些位置初始化:

    • 包含输入脚本的目录(或当前目录)
    • PYTHONPATH(目录名称列表,语法与
    • shell 变量路径)。依赖于安装的默认值。

    我在 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' 而不是文件的路径,要么是插件作者的问题,要么是我系统的一些潜在问题。

    【讨论】:

      【解决方案2】:

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

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

      "cwd": "$file_path"
      

      这意味着用光标在空白的 Sublime 面板中启动 SublimeREPL: Python 会导致 /opt/sublime_text/ 作为 cwd。这可能被认为是不受欢迎且令人困惑的。

      但是,如果您在光标位于要运行的 .py 文件中时启动 SublimeREPL: Python,则 REPL 将使用 当前 .py 文件的文件夹 strong> 作为它的 cwd。

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

      如果您将 cwd 的设置更改为:

      "cwd": "$folder",
      

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

      【讨论】:

      • 可以确认。事实证明,我有一个习惯,就是在一个空的 REPL 平面上有一个光标时打开一个 REPL。天哪,我多么讨厌这些东西。文档中没有提到这种行为,我赞扬每一个能够注意到这一切的天才都取决于该死的光标发生在哪里。我看到了它背后的逻辑,但仍然认为“$folder”参数对于默认设置会更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 2014-03-30
      • 1970-01-01
      • 2017-07-16
      • 2015-12-27
      相关资源
      最近更新 更多