在Emacs中设置Python项目根目录?

时间:2014-01-21 11:00:43

标签: python emacs python.el

emacs-for-python(基于python.el)提供了很好的启动Python进程和从Emacs发送缓冲区的能力(通常用C-c C-c执行)。但是,这样就为每个缓冲区创建新流程,并将Python的工作目录设置为相应文件的目录

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


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

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

如果我在文件mod1.py上启动Python进程,Emacs将自动将工作目录设置为myproject/package1,这样我将仅限于从同一个包导入模块。没有从其他包导入。没有绝对进口。痛。

目前我使用sys.path的技巧,例如:

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

在每个模块的开头。但这真的非常非常丑陋且不方便。

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

2 个答案:

答案 0 :(得分:2)

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

Projectile提供了一个函数projectile-project-root。您可以在mod1.py缓冲区中调用它,它将返回"/path/to/myproject"。这假定射弹可以识别您的项目根目录,如果您使用某种VCS,这将是正常的。

答案 1 :(得分: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是查找project-dir并设置它的简单python代码(它可以根据您的需要快速而肮脏地修改它)。然后我们添加一个inferior-python-mode-hook(即my-shell-dir-setup),以便在创建shell时在外壳中执行python代码。