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项目根目录有任何技巧或窍门吗?
解决方法:
好的,这应该可以帮助您入门
(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并进行设置(它又快又脏,您可能需要根据需要对其进行修改).然后我们添加一个下级python模式钩子(即my-shell-dir-setup),以便在每次创建外壳时在下级外壳中执行python代码.