jorgenschaefer/elpy

Installation instructions incomplete for offline installation

Opened this issue · 0 comments

Tcll commented

Before anything, I just want to say thank you for this detailed work covering many use cases :)

Steps to reproduce

1: complete the install process
2: hit Alt+X and enter elpy-config
3: when prompted to use pip, type n

an error should occure saying:
("Neither easy_install nor pip found")

My configuration

new (not even ready for use yet)

OS

Artix XFCE
kernel 5.17.6-artix1-1
installed May 11 2022 (not upgraded)

Result of (elpy-config)

Debugger entered--Lisp error: (error "Neither easy_install nor pip found")
  signal(error ("Neither easy_install nor pip found"))
  error("Neither easy_install nor pip found")
  (cond ((= (call-process elpy-rpc-python-command nil nil nil "-m" "pip" "--help") 0) (format "%s -m pip install %s%s" elpy-rpc-python-command upgrade-option python-package)) ((executable-find "easy_install") (format "easy_install %s" python-package)) (t (error "Neither easy_install nor pip found")))
  (let* ((python-package (widget-get widget :package)) (do-upgrade (widget-get widget :upgrade)) (upgrade-option (if do-upgrade "--upgrade " "")) (command (cond ((= (call-process elpy-rpc-python-command nil nil nil "-m" "pip" "--help") 0) (format "%s -m pip install %s%s" elpy-rpc-python-command upgrade-option python-package)) ((executable-find "easy_install") (format "easy_install %s" python-package)) (t (error "Neither easy_install nor pip found"))))) (widget-put widget :command command) (if do-upgrade (insert (format "Update %s" python-package)) (insert (format "Install %s" python-package))))
  elpy-insert--pip-button-value-create((elpy-insert--pip-button :package "jedi"))
  widget-apply((elpy-insert--pip-button :package "jedi") :value-create)
  widget-default-create((elpy-insert--pip-button :package "jedi"))
  widget-apply((elpy-insert--pip-button :package "jedi") :create)
  widget-create(elpy-insert--pip-button :package "jedi")
  (progn (elpy-insert--para "The Jedi package is not currently installed. " "This package is needed for code completion, code n..." "and access to documentation.\n") (insert "\n") (widget-create 'elpy-insert--pip-button :package "jedi") (insert "\n\n"))
  (if (and (gethash "rpc_python_executable" config) (not (gethash "jedi_version" config))) (progn (elpy-insert--para "The Jedi package is not currently installed. " "This package is needed for code completion, code n..." "and access to documentation.\n") (insert "\n") (widget-create 'elpy-insert--pip-button :package "jedi") (insert "\n\n")))
  (let* ((rpc-python-version (gethash "rpc_python_version" config))) (if (gethash "rpc_python_executable" config) nil (elpy-insert--para "Elpy can not find the configured..." "sure that the variable `elpy-rpc..." "command in your PATH. You can ch...")) (if (and (gethash "rpc_python_executable" config) (not (gethash "virtual_env" config))) (progn (elpy-insert--para "You have not activated a virtual..." " often a good idea to work insid..." "`M-x pyvenv-activate` or `M-x py..."))) (if (and (not (memq system-type ...)) (gethash "rpc_python_executable" config) (not pyvenv-virtual-env) (not (or ... ...))) (progn (elpy-insert--para "The directory ~/.local/bin/ is n..." "no active virtualenv, installing..." "place executables in that direct..." "If you are missing some commands..." "PATH -- and then do `elpy-rpc-re..."))) (if (and (gethash "rpc_python_executable" config) (not (gethash "elpy_version" config))) (progn (elpy-insert--para "The Python interpreter could not..." "Please report to: " "https://github.com/jorgenschaefe..." "\n") (insert "\n"))) (if (and (gethash "elpy_version" config) (not (equal ... elpy-version))) (progn (let (...) (elpy-insert--para "The Elpy backend is version " elpy-python-version " while " "the Emacs package is " elpy-version ". This is incompatible. " "Please report to: https://github..." "\n")))) (if (gethash "error_output" config) (progn (elpy-insert--para "There was an unexpected problem ..." "check the following output to se..." "To me, it doesn't.\n") (insert "\n" (gethash "error_output" config) "\n" "\n"))) (if (and pyvenv-virtual-env (not (string-prefix-p ... ...))) (progn (elpy-insert--para "The python interactive interpret..." python-shell-interpreter ") is not installed on the curren..." pyvenv-virtual-env "). The system binary (" (executable-find python-shell-interpreter) ") will be used instead." "\n") (insert "\n") (widget-create 'elpy-insert--pip-button :package python-shell-interpreter :norpc t) (insert "\n\n"))) (if (not (gethash "can_connect_to_pypi" config)) (progn (elpy-insert--para "Elpy could not connect to Pypi (..." "and check if the python packages..." "You can still try to update all ..." "\n") (insert "\n") (widget-create 'elpy-insert--generic-button :button-name "[Update python packages]" :function #'...) (insert "\n\n"))) (if (and (equal elpy-rpc-virtualenv-path 'default) (elpy-rpc--pip-missing)) (progn (elpy-insert--para "Pip doesn't seem to be installed..." "created by Elpy (" (elpy-rpc-get-virtualenv-path) "). " "This may prevent some features f..." " (completion, documentation, ref..." "You can try reinstalling the vir..." "If the problem persists, please ..." "\n\n") (widget-create 'elpy-insert--generic-button :button-name "[Reinstall RPC virtualenv]" :function #'...) (insert "\n\n"))) (if (and (gethash "rpc_python_executable" config) (not (gethash "jedi_version" config))) (progn (elpy-insert--para "The Jedi package is not currentl..." "This package is needed for code ..." "and access to documentation.\n") (insert "\n") (widget-create 'elpy-insert--pip-button :package "jedi") (insert "\n\n"))) (if (and (gethash "jedi_version" config) (gethash "jedi_latest" config)) (progn (elpy-insert--para "There is a newer version of Jedi...") (insert "\n") (widget-create 'elpy-insert--pip-button :package "jedi" :upgrade t) (insert "\n\n"))) (if (or (gethash "autopep8_version" config) (gethash "yapf_version" config) (gethash "black_version" config)) nil (elpy-insert--para "No autoformatting package is cur..." "At least one is needed (Autopep8..." "to perform autoformatting (`C-c ...") (insert "\n") (widget-create 'elpy-insert--pip-button :package "autopep8") (insert "\n") (widget-create 'elpy-insert--pip-button :package "yapf") (insert "\n") (widget-create 'elpy-insert--pip-button :package "black") (insert "\n\n")) (if (and (gethash "autopep8_version" config) (gethash "autopep8_latest" config)) (progn (elpy-insert--para "There is a newer version of the ...") (insert "\n") (widget-create 'elpy-insert--pip-button :package "autopep8" :upgrade t) (insert "\n\n"))) (if (and (gethash "yapf_version" config) (gethash "yapf_latest" config)) (progn (elpy-insert--para "There is a newer version of the ...") (insert "\n") (widget-create 'elpy-insert--pip-button :package "yapf" :upgrade t) (insert "\n\n"))) (if (and (gethash "black_version" config) (gethash "black_latest" config)) (progn (elpy-insert--para "There is a newer version of the ...") (insert "\n") (widget-create 'elpy-insert--pip-button :package "black" :upgrade t) (insert "\n\n"))) (if (executable-find (car (split-string elpy-syntax-check-command))) nil (elpy-insert--para (format "The configured syntax checker (%..." (car ...)) "program to provide syntax checks..." "install it, or select another on...") (insert "\n") (widget-create 'elpy-insert--pip-button :package "flake8" :norpc t) (insert "\n\n")))
  elpy-config--insert-configuration-problems(#<hash-table equal 21/65 0x1128ccd>)
  (save-current-buffer (set-buffer buf) (elpy-insert--header "Elpy Configuration") (elpy-config--insert-configuration-table config) (insert "\n") (elpy-insert--header "Warnings") (elpy-config--insert-configuration-problems config) (elpy-insert--header "Options") (let ((custom-buffer-style 'tree)) (Custom-mode) (elpy-config--insert-help) (let ((--dolist-tail-- elpy-config--related-custom-groups)) (while --dolist-tail-- (let ((cust (car --dolist-tail--))) (widget-create 'custom-group :custom-last t :custom-state 'hidden :tag (car cust) :value (car (cdr cust))) (setq --dolist-tail-- (cdr --dolist-tail--))))) (widget-setup) (goto-char (point-min))))
  (let ((buf (custom-get-fresh-buffer "*Elpy Config*")) (config (elpy-config--get-config)) (custom-search-field nil)) (save-current-buffer (set-buffer buf) (elpy-insert--header "Elpy Configuration") (elpy-config--insert-configuration-table config) (insert "\n") (elpy-insert--header "Warnings") (elpy-config--insert-configuration-problems config) (elpy-insert--header "Options") (let ((custom-buffer-style 'tree)) (Custom-mode) (elpy-config--insert-help) (let ((--dolist-tail-- elpy-config--related-custom-groups)) (while --dolist-tail-- (let ((cust ...)) (widget-create 'custom-group :custom-last t :custom-state 'hidden :tag (car cust) :value (car ...)) (setq --dolist-tail-- (cdr --dolist-tail--))))) (widget-setup) (goto-char (point-min)))) (pop-to-buffer-same-window buf))
  elpy-config()
  funcall-interactively(elpy-config)
  call-interactively(elpy-config record nil)
  command-execute(elpy-config record)
  execute-extended-command(nil "elpy-config" "elpy-config")
  funcall-interactively(execute-extended-command nil "elpy-config" "elpy-config")
  call-interactively(execute-extended-command nil nil)
  command-execute(execute-extended-command)

Additional Information

(my configs won't help you as they're still quite vanilla)

my python 3.10 installation included with Artix has been completely removed and all python-software uses a wide selection of anaconda interpreters ranging from python 3.4 (main (what I develop for)) to 3.7 (special case)
all of which are located in ~/Programs/python/

additionally ~/Programs/emacs/AppRun (version 27.1) is run in a Custom Home Directory (think of a wine bottle for individual programs) located in ~/.home/emacs-main/
(basically I can have multiple emacs configs for different purposes like an IDE vs a basic text editor, all using the same AppRun)

the idea is for complete portability (and control)
(consider formatting your distro if you ever want to hop, will you be prepared to the point your programs won't break?)

additionally, I've always warned against reliance on the internet/cloud (pacman, pip, Melpha, etc.) for many years now
so I usually work completely offline (aside from my GiTea I'm currently setting up over I2P)

as such, the required python deps should be either listed or included, if not capable of running without python
(unless the deps (pyvenv) can be removed completely as I tend to not use venvs)

Extra wide detail

I should also mention I'm a complete noob to emacs :)
all of my python development has been done on IDEA (offline) for many years
I'm just looking for an alternative IDE, and was informed emacs can do just about everything IDEA can, while also being lightweight and performant
(don't expect me to understand the keyboard shortcuts and such, as I work with a mouse and prefer a GUI, and intend to configure emacs for everything I had with IDEA) ;)

how specifically do I code so you know what to work with if you want to support my workflow?
1: take an anaconda interpreter
2: delete the entire standard library and build a singular tiny encodings.py boot code
3: only use portable libraries (.dll/so) supporting 8+yo OSs
4: write all bindings yourself (because there's nothing available that's good)
5: bundle the interpreter with your program (full size of ~12MiB)

image showing 4 interpreters I've done these steps to:
https://jump.matthewevan.xyz/i2p/pxbcwxbhxj2wusliwhrb6ym4vcwpihztuf2tfjejrcdzqrmnjuoa.b32/_/f789c3de2c60057237cc7caa4c031d93aecb52089bcb78e557ecf3ffa76ff145

so yeah, I don't need all the integration/convenience nonsense, just give me something I can tie my relative interpreter to for debugging :)
(like I can do with IDEA)