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的项目根目录?
答案 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代码。