emacs和python更新模块

时间:2011-08-04 13:51:13

标签: python emacs emacs23 python-module

atm我正在使用emacs来编写一些python代码,到目前为止,它工作得非常好,除了一个真的有点烦人的问题。

总是当我在自编写模块中更新内容时,我会重新评估缓冲区,并且emacs内的python shell中的模块不会更新。我总是必须结束python进程并再次启动以获得更改。我发现emacs会将一些东西复制到tmp目录来执行它们,所以我猜它与此有关。

也许有人在那里遇到了同样的问题并且已经解决了,所以很感激帮助

4 个答案:

答案 0 :(得分:2)

您必须在shell中手动重新加载模块才能使其生效。

请参阅Python重载函数

上的文档here

我问了一个类似的问题,你可以看到here

答案 1 :(得分:1)

我找到了一个更好的解决方案,不需要emacs配置:

简单地做

$ ipython profile create

应该在

中创建ipython个人资料
$HOME/.ipython/profile_default/ipython_config.py  

然后将以下内容放在

c = get_config()
c.TerminalInteractiveShell.editor = 'emacsclient'
c.InteractiveShellApp.extensions = [
     'autoreload'
]

c.InteractiveShellApp.exec_lines = []
c.InteractiveShellApp.exec_lines.append('%load_ext autoreload')
c.InteractiveShellApp.exec_lines.append('%autoreload 2')

然后重启emacs。现在,每次在emacs中保存对文件的更改时 - ipython会自动重新加载

以及我的emacs配置中的以下内容

;; ------------------
;; misc python config
;; ------------------
(company-mode -1)
(elpy-enable)
(elpy-use-ipython "ipython")
(setq python-shell-interpreter "ipython" python-shell-interpreter-args "--simple-prompt --pprint")
(setq python-check-command "flake8")
(setq elpy-rpc-backend "jedi")
(setq elpy-rpc-python-command "python")
; https://github.com/gregsexton/ob-ipython/issues/28
(setq python-shell-completion-native-enable nil)

如果你想查看我的完整python配置,它是here

答案 2 :(得分:0)

您可以建议使用python-mode.el函数来获得所需的效果(至少,如果我正确理解您的请求)。将以下内容放在Emacs init文件中:

(defun py-reload-file (buf)
  "Reload buffer's file in Python interpreter."
  (let ((file (buffer-file-name buf)))
    (if file
        (progn
          ;; Maybe save some buffers
          (save-some-buffers (not py-ask-about-save) nil)
          (let ((reload-cmd
                 (if (string-match "\\.py$" file)
                     (let ((f (file-name-sans-extension
                               (file-name-nondirectory file))))
                       (format "if globals().has_key('%s'):\n    reload(%s)\nelse:\n    import %s\n"
                               f f f))
                   (format "execfile(r'%s')\n" file))))
            (save-excursion
              (set-buffer (get-buffer-create
                           (generate-new-buffer-name " *Python Command*")))
              (insert reload-cmd)
              (py-execute-base (point-min) (point-max))))))))

(defadvice py-execute-region
  (around reload-in-shell activate)
  "After execution, reload in Python interpreter."
  (save-window-excursion 
    (let ((buf (current-buffer)))
      ad-do-it
      (py-reload-file buf))))

现在,当你在python程序中时,你可以选择一个代码区域,按 C- | 来评估该区域,并重新加载python程序(如果它不是,则导入先前已加载)在Python解释器缓冲区中。将重新加载整个模块,而不仅仅是已选择的区域,如果尚未保存python文件,系统将提示您保存该文件。请注意,对your previous question的回复中提到的警告仍然适用(例如 - 如果您已经从导入的模块创建了类实例,已实例化其他对象等,则不会重新加载它们)。可能会发生一般性破损,因此需要注意!)。

答案 3 :(得分:0)

我建议使用here中讨论过的Elpy。

将以下内容添加到Emacs配置文件中:

(defun my-restart-python-console ()
  "Restart python console before evaluate buffer or region to avoid various uncanny conflicts, like not reloding modules even when they are changed"
  (interactive)
  (if (get-buffer "*Python*")
      (let ((kill-buffer-query-functions nil)) (kill-buffer "*Python*")))
  (elpy-shell-send-region-or-buffer))

(global-set-key (kbd "C-c C-x C-c") 'my-restart-python-console)

重新启动Emacs,使用C-c C-x C-c

简而言之,此代码具有“ if子句”,用于检查 Python 缓冲区是否已打开。这将有助于即使在没有打开任何Python进程的情况下,也可以在开发的任何时间运行C-c C-x C-c。另一部分是kill-buffer-query-functions,它忽略了杀死 Python 缓冲区的提示。