Python模式导入问题

时间:2010-04-17 13:20:01

标签: python emacs

我正在尝试使用Emacs作为python编辑器,当我评估(Cc Cc)只有单个文件时它工作正常但是当我评估一个导入同一目录中的另一个文件的文件时,我得到一个错误,说明了文件无法导入。

有没有人知道解决方法?

提前致谢

编辑:顺便说一下,我在Ubuntu机器上使用Emacs23。

错误是,

  ImportError: No module named hlutils 

9 个答案:

答案 0 :(得分:16)

我认为问题在于Emacs的python-mode运行Python的方式。如果我输入M-x run-python,那么我会看到:

>>> import sys
>>> '' in sys.path
False
>>> 

如果我从shell运行python解释器,我看到:

>>> import sys
>>> '' in sys.path
True
>>> 

这似乎是由于来自progmodes / python.el的run-python中的以下代码:

(let* ((cmdlist
    (append (python-args-to-list cmd)
        '("-i" "-c" "import sys; sys.path.remove('')")))

没有评论,以及以下有用的ChangeLog条目:

2008-08-24  Romain Francoise  <romain@orebokech.com>

        * progmodes/python.el (run-python): Remove '' from sys.path.

我想说这是Emacs中的一个错误。这是您可以放在.emacs文件中的解决方法:

(defun python-reinstate-current-directory ()
  "When running Python, add the current directory ('') to the head of sys.path.
For reasons unexplained, run-python passes arguments to the
interpreter that explicitly remove '' from sys.path. This means
that, for example, using `python-send-buffer' in a buffer
visiting a module's code will fail to find other modules in the
same directory.

Adding this function to `inferior-python-mode-hook' reinstates
the current directory in Python's search path."
  (python-send-string "sys.path[0:0] = ['']"))

(add-hook 'inferior-python-mode-hook 'python-reinstate-current-directory)

答案 1 :(得分:12)

由于发布了此前的答案,因此可以使用一个选项来更改默认行为(从路径中删除当前目录)以将cwd包含在路径中。

这么简单

(setq python-remove-cwd-from-path nil)
你的.emacs中的

应该解决这个问题。

答案 2 :(得分:1)

使用py-execute-buffer时,我可以很好地从同一目录导入本地模块。

您的问题可能与py-execute-buffer关于其工作的方式有关:它将缓冲区保存到tmp文件(在目录py-temp-directory中),然后将此文件传递给Python。在您的情况下,系统可能会受临时文件目录的影响。

另一个方面:py-execute-buffer对tmp文件做了不同的事情,具体取决于是否存在Python解释器缓冲区。尝试使用正在运行的解释器并且不使用(只需终止解释器缓冲区)。

答案 3 :(得分:1)

我遇到同样的问题,如果您不想编辑.emacs文件,可以将其放在脚本的开头:

import sys
import os
sys.path.append(os.getcwd())

它暂时将当前工作的目录添加到您的sys.path中,

答案 4 :(得分:0)

打开终端并输入emacs -q。这将启动emacs而不加载init文件(.emacs)。是否会出现相同的行为?如果没有,则表示您的.emacs文件存在问题。

修改

当您在Emacs的Python模式下使用C-c C-c运行脚本时,包含该脚本的目录 not 已添加到sys.path的开头。我发现了

import sys
print sys.path

位于测试脚本的顶部。这就是Python没有找到位于同一目录中的其他模块的原因。

从命令行运行脚本时,Python会将包含脚本的目录添加到sys.path。这就是为什么相同的脚本可以从命令行运行。

您可以通过编辑〜/ .bashrc文件并添加

来解决此问题
export PYTHONPATH=/path/to/Python/scripts

保存〜/ .bashrc后,关闭emacs并再次启动它以确保对.bashrc的更改生效。

答案 5 :(得分:0)

我对emacs lisp非常糟糕,而且我从未使用过Ubuntu,所以以下内容可能需要一些调整,但如果代码运行良好,为什么不设置emacs来运行shell命令呢?只是说:

(defun shell-compile ()
  (interactive)
  (shell-command (concat "python " (buffer-file-name))))

(add-hook 'python-mode-hook
          (lambda () (local-set-key (kbd "\C-c\C-c") 'shell-compile)))

进入.emacs文件。必须有更清洁的方法,但这至少会让你工作。

答案 6 :(得分:0)

改进上面的现有答案:在你的暂存缓冲区中使用它来将cwd添加回pythonpath

(defun python-reinstate-current-directory ()
  (python-send-string "sys.path[0:0] = ['']"))
(add-hook 'inferior-python-mode-hook 'python-reinstate-current-directory)

答案 7 :(得分:0)

我提出了一个非常简单的解决方案。 只需在.emacs添加以下单行:

(setenv "PYTHONPATH" "/path/to/where/modules/are")

它会将名为variable的环境变量的值设置为value。

现在,输入emacs python interpreter ...

>>> import sys
>>> sys.path
>>> ['/path/to/where/modules/are', '/usr/share/emacs/23.1/etc' ... ]

...以及自定义import的工作。

答案 8 :(得分:0)

我有同样的问题。我注意到,当我在Emacs中使用run-python命令时,它将在Ubuntu构建中运行默认的Python版本(2.7)。那是不对的。我安装了Anaconda。当我从命令行启动Python时,它将启动Anaconda安装(3.7)。

在这篇文章中查看詹姆斯·安德森的答案:

Emacs and condo workaround

对我来说他是对的。如果我从命令行启动Emacs,则Emacs知道Anaconda添加的劫持路径。如果可以的话,我相信我可以将其纳入Emacs初始化。