lsp-mode client leveraging Microsoft’s python-language-server.
This project is marked as DEPRECATED, since [Microsoft’s Python Lang Server](https://github.com/microsoft/python-language-server) has already been archived and is replaced by [pyright](https://github.com/microsoft/pyright). The successor is [lsp-pyright](https://github.com/emacs-lsp/lsp-pyright).
Include lsp-python-ms in the configuration file:
(require 'lsp-python-ms)
(setq lsp-python-ms-auto-install-server t)
(add-hook 'python-mode-hook #'lsp) ; or lsp-deferredA minimal use-package initialization might be:
(use-package lsp-python-ms
  :ensure t
  :init (setq lsp-python-ms-auto-install-server t)
  :hook (python-mode . (lambda ()
                          (require 'lsp-python-ms)
                          (lsp))))  ; or lsp-deferredBuilding the executable manually is difficult on NixOS, but it can be easily installed via the package manager. At the time of writing (May 2020), it is not available on the 20.03 release, but can be acquired on the unstable branch.
nix-channel --add https://nixos.org/channels/nixos-unstable nixos
nix-channel --update nixosYou can then install the executable by running nix-env -iA nixpkgs.python-language-server
  or by adding nixpkgs.python-language-server to your configuration.nix and creating a new generation.
  Note that python37Packages.python-language-server refers to Palintir’s language server, not Microsoft’s.
Finally, ensure that Emacs knows where to find the executable by setting lsp-python-ms-executable.
(use-package lsp-python-ms
  :ensure t
  :hook (python-mode . (lambda ()
                         (require 'lsp-python-ms)
                         (lsp)))
  :init
  (setq lsp-python-ms-executable (executable-find "python-language-server")))
Normally the python-language-server will be downloaded automatically if it doesn’t exist while opening the python scripts.
If you have troubles to download the package, you can also build the server yourselves.
- Install dotnet-sdk
- Clone and build python-language-server:
    git clone https://github.com/Microsoft/python-language-server.git cd python-language-server/src/LanguageServer/Impl dotnet publish -c Release -r osx-x64 # mac Change the -rflag according to your architecture and operating system. See Microsoft’s Runtime ID Catalog for the right value for your system.Then make the binary executable. chmod a+x $(git rev-parse --show-toplevel)/output/bin/Release/osx-x64/publish/Microsoft.Python.LanguageServerNOTE: on some systems (for example, Fedora), the executable comes out as Microsoft.Python.LanguageServer.LanguageServer.
- Set executable to lsp-python-ms-executable.;; for executable of language server, if it's not symlinked on your PATH (setq lsp-python-ms-executable "~/python-language-server/output/bin/Release/osx-x64/publish/Microsoft.Python.LanguageServer") 
For development, you might find it useful to run cask install.
- Unresolved import warnings
    Set workspace root of `lsp-mode` properly, and add the extra directories to lsp-python-ms-extra-pathsorPYTHONPATH. Refer to Troubleshooting - Unresolved import warnings and #96.
- Autocompletion doesn’t work
    The folder may have huge folders and files, and the server takes a long time to index them. So please DO NOT put huge files in the project/workspace folder. 
- Set path of the Python executable for each project/workspace
    Set the variable lsp-python-ms-python-executablebefore the `lsp-mode` being loaded.First, add hack-local-variables-hookin `init.el` to achieve loading `lsp-mode` after the `.dir-locals.el` file of each project/workspace being loaded.(add-hook 'hack-local-variables-hook (lambda () (when (derived-mode-p 'python-mode) (require 'lsp-python-ms) (lsp)))) ; or lsp-deferred Second, create `.dir-locals.el` file in the root directory of project to specify the varibale lsp-python-ms-python-executablefor the project/workspace.((python-mode . ((lsp-python-ms-python-executable . "/.../bin/python")))) 
All credit to cpbotha on vxlabs! This just tidies and packages his work there.