atm我正在使用emacs来编写一些python代码,到目前为止,它工作得非常好,除了一个真的有点烦人的问题。
总是当我在自编写模块中更新内容时,我会重新评估缓冲区,并且emacs内的python shell中的模块不会更新。我总是必须结束python进程并再次启动以获得更改。我发现emacs会将一些东西复制到tmp目录来执行它们,所以我猜它与此有关。
也许有人在那里遇到了同样的问题并且已经解决了,所以很感激帮助
答案 0 :(得分:2)
答案 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 缓冲区的提示。