[英]Why SublimeREPL won't import a Python module or read a file in CWD?
我正在使用SublimeREPL插件在Ubuntu Zesty上使用Sublime Text 3 build 3126。
我使用CTRL + SHIFT + P >> SublimeREPL打开Python REPL :Python,并使用CTRL +,F和everything将文件发送到REPL,只要我使用单个Python脚本文件即可。 一旦我尝试将代码的某些部分移至另一个模块并将其导入主文件中,就会收到讨厌的ImportError:没有名为 error的模块 。
尝试使用以下命令打开位于同一目录中的文本文件:
codecs.open('filename', encoding='utf-8')
结果是:
IOError: [Errno 2] No such file or directory: 'filename'
您是否调查了打开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。
我花了整整一天的时间试图寻找解决此问题的方法。
首先,我认为$ PYTHONPATH存在一些问题。 我关注了SublimeREPL GitHub页面上此封闭期刊中给出的线索: https : //github.com/wuub/SublimeREPL/issues/355
并且尽管插件作者提供的解决方案不起作用,但将Packages / SublimeREPL / config / Python / Main.sublime-menu菜单中包含我工作目录路径的PYTHONPATH变量添加到了extend_env键中,可以解决导入失败的问题。
我以为自己很黄金,然后我尝试用Python读取文本文件并得到IOError。 然后终于让我知道错误的CWD(当前工作目录)是罪魁祸首。
如Python文档所指定:
“导入名为spam的模块时,解释器首先搜索具有该名称的内置模块。如果找不到,则解释器将在变量sys.path给出的目录列表中搜索名为spam.py的文件。 sys.path从以下位置初始化:
- 包含输入脚本的目录(或当前目录) 。
- PYTHONPATH(目录名称列表,语法与
- shell变量PATH)。 取决于安装的默认值。
我尝试在REPL promt中导入os并打印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'而不是文件的路径,这是插件作者的问题,还是我系统的一些潜在问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.