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

时间:2017-07-13 10:17:27

标签: python sublimetext3 sublimerepl

我使用 SublimeREPL 插件在 Ubuntu Zesty 上使用 Sublime Text 3 构建3126。

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

尝试使用以下命令打开位于同一目录中的文本文件:

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

结果:

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

2 个答案:

答案 0 :(得分: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文件的文件夹作为其cwd。

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

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

"cwd": "$folder",

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

答案 1 :(得分:0)

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

首先我认为$ 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变量PATH)。依赖于安装的默认值。
  •   

我在REPL promt中尝试了 import os print 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',而不是文件的路径是插件作者的问题或者我系统的一些底层怪癖。