3

emacs-for-python(基于python.el)提供了很好的能力来启动 Python 进程并直接从 Emacs 那里发送缓冲区(通常你用C-c C-c)。但是,这种方式会为每个缓冲区创建新进程,并将 Python 的工作目录设置为相应文件的目录。

相反,我希望将工作目录设置为项目根目录的单个 Python 进程。或者甚至可能是几个进程,但从根目录开始,而不是模块的目录。


为什么我需要它?都是关于进口的。想象一下以下项目结构:

myproject
   package1
      __init__.py
      mod1.py
   package2
      __init__.py
      mod2.py

如果我在 file 上启动 Python 进程mod1.py,Emacs 会自动将工作目录设置为,myproject/package1这样我就只能从同一个包中导入模块。没有从其他包导入。没有绝对进口。疼痛。

目前我使用一个技巧sys.path,比如:

import sys, os
sys.path.insert(0, os.path.join(os.path.abspath(__file__), '..', '..'))

在每个模块的开头。但这真的,真的,真的很丑陋和不方便。

那么有没有人有任何提示或技巧来为 Emacs 中的劣质进程设置 Python 的项目根目录?

4

2 回答 2

2

好的,这应该让你开始

(defvar my-python-shell-dir-setup-code 
  "import os
home = os.path.expanduser('~')
while os.path.isfile('__init__.py') and (os.getcwd() != home):
    os.chdir('..')
del os")

(defun my-python-shell-dir-setup ()
  (let ((process (get-buffer-process (current-buffer))))
    (python-shell-send-string my-python-shell-dir-setup-code process)
    (message "Setup project path")))

(add-hook 'inferior-python-mode-hook 'my-python-shell-dir-setup)

这是我们正在做my-python-shell-dir-setup-code的是简单的python代码来查找project-dir和设置它(它又快又脏,你可能想根据你的需要修改它)。然后我们添加一个inferior-python-mode-hook(ie my-shell-dir-setup) 以在创建 shell 时执行劣质 shell 中的 python 代码。

于 2014-01-21T19:07:50.503 回答
2

我不熟悉 emacs-for-python,但是找到项目根目录的路径很简单。

弹丸提供了一个功能projectile-project-root。你可以在你的 mod1.py 缓冲区中调用它,它会返回"/path/to/myproject". 这假设 projectile 可以识别您的项目根目录,如果您使用某种 VCS 就可以了。

于 2014-01-21T15:39:07.460 回答