From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Eric Abrahamsen Newsgroups: gmane.emacs.devel Subject: Re: Eglot, project.el, and python virtual environments Date: Wed, 16 Nov 2022 17:14:28 -0800 Message-ID: <87o7t6z8jv.fsf@ericabrahamsen.net> References: <87zgcq68zp.fsf@ericabrahamsen.net> <87bkp6jxng.fsf@posteo.net> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="361"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) To: emacs-devel@gnu.org Cancel-Lock: sha1:JICErZIjTp9FUdnxbI94ovXS8XM= Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Thu Nov 17 07:13:59 2022 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ovY9v-000AN8-Eo for ged-emacs-devel@m.gmane-mx.org; Thu, 17 Nov 2022 07:13:59 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ovY9G-0001iD-Dv; Thu, 17 Nov 2022 01:13:18 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ovTUG-0000XG-H5 for emacs-devel@gnu.org; Wed, 16 Nov 2022 20:14:40 -0500 Original-Received: from ciao.gmane.io ([116.202.254.214]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ovTUE-0000OT-Fa for emacs-devel@gnu.org; Wed, 16 Nov 2022 20:14:40 -0500 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1ovTUB-0003ea-KB for emacs-devel@gnu.org; Thu, 17 Nov 2022 02:14:35 +0100 X-Injected-Via-Gmane: http://gmane.org/ Received-SPF: pass client-ip=116.202.254.214; envelope-from=ged-emacs-devel@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: -15 X-Spam_score: -1.6 X-Spam_bar: - X-Spam_report: (-1.6 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.25, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Thu, 17 Nov 2022 01:13:17 -0500 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:300009 Archived-At: Philip Kaludercic writes: > Eric Abrahamsen writes: > >> Hi, >> >> Here's another issue that's technically a emacs.help question, but might >> result in some code/documentation updates, so I'm sending it here. >> >> My main day-job code base is an AWS CloudFormation monstrosity involving >> several Python Lambdas, among other things. Basic project structure >> looks like: >> >> project_root >> ├── .git >> ├── src >> │ └── python >> │ ├── VeryImportantLambda >> │ │ └── .venv >> │ ├── MoreImportance >> │ │ └── .venv >> │ ├── RunInCaseOfEmergency >> │ │ └── .venv >> >> I'm using the python-lsp-server python package in each Python >> subdirectory, and the key is that each of those directories is a virtual >> environment that needs to stay isolated from the others. Each has >> different packages installed, and in some cases even the Python versions >> are different (though I'm trying to get rid of that). >> >> When I was using lsp-mode this wasn't difficult, because lsp-mode and >> project.el are essentially orthogonal: if I visited a python file in a >> given lambda directory, I could use `pyvenv-activate' to activate that >> environment, and then the `lsp' invocation would confine itself to >> python files within the environment. Project.el just provided >> project-wide navigation. >> >> Now I'm trying to move to Eglot, and there is tighter integration >> between Eglot and project.el. Turning on Eglot in one lambda starts the >> server for all Python libraries in the whole project, not just the >> current environment. I looked into constructing my own version of the >> call to `eglot', but it is tightly tied to a project, all the way down. >> >> Is anyone else handling this situation? Any suggestions how to make it >> work? > > I am not certain if this is the right tool for the job, but have you > taken a look at `buffer-env'? I have used it in combination with Eglot, > but the problem I was tackling was not the same as yours. I hadn't seen that before, thanks. But it's pretty much what pvenv and poetry-mode (and probably others) already do: make sure that a python virtual environment is "activated" for buffers in a particular directory tree. With Danny's nudging I've nearly got this working, except for the virtual environment aspect: once I've run Eglot in one python-mode buffer, any time I switch to another python-mode buffer Eglot runs immediately, before I've had time to activate the virtual environment, and so fails to find the language server executable. I'm sure with the proper use of hooks I'll be able to squeeze the `pyvenv-activate' call in before Eglot runs. Eric