我在emacs里运行python文件,总是提示找不到项目根目录下的自编模块,有没有办法设置这个项目根目录?就像pycharm里面一样,把项目根目录设置为source root,就可以直接调用根目录下的自编模块。
我安装了elpy.el然后直接C-c C-c运行
(setq elpy-shell-use-project-root t)
让用 project-root,查找函数可以通过 elpy-project-root-finder-functions
设置(默认已经写了很多了),或者设置为你想要的目录 (setq elpy-shell-starting-directory 'current-directory)
https://elpy.readthedocs.io/en/latest/ide.html#command-elpy-shell-switch-to-shell
查找函数设置elpy-project-root-finder-functions
要怎么设?
去看值,应该有几个函数,我记得默认 projectile project git 都支持了
我是新手,这个不懂怎么看值?在哪里看
C-h v 请网上找新手教程,
elpy-project-root-finder-functions is a variable defined in ‘elpy.el’. Its value is (elpy-project-find-projectile-root elpy-project-find-python-root elpy-project-find-git-root elpy-project-find-hg-root elpy-project-find-svn-root elpy-project-find-django-root) Original value was (elpy-project-find-projectile-root elpy-project-find-python-root elpy-project-find-git-root elpy-project-find-hg-root elpy-project-find-svn-root)
你回复我值有啥用,我又不是不知道。。。文档中都有写,你要去看啊😢
这些值你看名字也能猜出来是干啥的嘛,如果你的项目路径满足 projectile 能识别,有常见的 Python 项目文件(setup.py),或者是 git svn 管理,按理说 elpy 应该能正确识别。至于说你咋想办法让他符合 elpy 查找方式,或者说发现不符合预期就是你的事情了,我又帮不了你。
说实话大家都是新手过来的,论坛很多问题我会随手查下然后回复一波,但是你有点过于伸手了。
谢谢,我再慢慢琢磨,谢谢了。
抱歉,中午语气有点不好,实在是你问得怎么查值太入门了,甚至我给你贴的链接你都不点开。 建议你找些入门教程认真看看(举例:GNU Emacs - System Crafters )
回到你的问题,如果你用的是 vanilla 配置,项目根目录下 git init
,或者你用的是几个主流社区配置,在项目下建一个空的 .projectile
应该也行。如果不行,请附上详细配置,sample project,复现步骤去 GitHub 上报 issue(而不是像这个帖子一样只说个不行)
没关系的,谢谢你。教程我在慢慢看。我看了一些帖子,在根目录建了.projectile和requests.txt这些文件都没用,仍然找不到, (setq elpy-shell-use-project-root t)也已经设置了。下面是我的init.el文件:
(add-to-list 'load-path "~/.emacs.d/lisp/")
(defun open-my-init-file()
(interactive)
(find-file "~/.emacs.d/init.el"))
;; Package Management
;; -----------------------------------------------------------------
(require 'init-packages)
;; Python init
;; -----------------------------------------------------------------
(require 'init-python)
;; haskell init
;; -----------------------------------------------------------------
(require 'init-haskell)
;; 显示时间
(display-time)
;; 设置和系统互相粘贴
(setq x-select-enable-clipboard t)
;; 有道词典Enable Cache
(setq url-automatic-caching t)
(global-set-key (kbd "C-q") 'youdao-dictionary-search-at-point+)
;; 禁用\e\e和\C-x\C-u
(global-unset-key "\e\e")
(global-unset-key "\C-x\C-u")
;; use company mode in all buffers
(add-hook 'after-init-hook 'global-company-mode)
;; use elpy
(elpy-enable)
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(conda-anaconda-home "~/anaconda3/")
'(package-selected-packages
'(projectile elpygen youdao-dictionary use-package haskell-mode elpy eglot conda)))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)
此外我还在.emacs.d/lisp/文件夹下设置了一个init-python.el文件,内容如下(这些内容都是网上东拼西凑复制过来的):
;; 配置conda虚拟环境
(require 'conda)
;; if you want interactive shell support, include:
(conda-env-initialize-interactive-shells)
;; if you want eshell support, include:
(conda-env-initialize-eshell)
;; if you want auto-activation (see below for details), include:
(conda-env-autoactivate-mode t)
;; 指定anaconda的安装目录
(custom-set-variables
'(conda-anaconda-home "~/anaconda3"))
;; 指定anaconda的配置目录
(setq conda-env-home-directory (expand-file-name "~/anaconda3/"))
;; 设置环境变量
(setenv "PATH" "/home/yinxiuqu/Nutstore Files/projects/quantming")
;; (setenv "HOME" "/home/yinxiuqu/Nutstore Files/projects/quantming")
;; (setq default-directory "/home/yinxiuqu/Nutstore Files/projects/quantming")
(setq command-line-default-directory "/home/yinxiuqu/Nutstore Files/projects/quantming")
;; 设置python空格
(setq tab-width 4)
(set-variable 'python-indent-offset 4)
(set-variable 'python-indent-guess-indent-offset nil)
;; 设置projectile
(setq elpy-shell-use-project-root t)
;; 文件末尾
(provide 'init-python)
最后这里是我的一个init-packages的管理包的文件:
(when (>= emacs-major-version 24)
(require 'package)
(setq package-archives '(("gnu" . "http://elpa.emacs-china.org/gnu/")
("melpa" . "http://elpa.emacs-china.org/melpa/")
("org" . "https://elpa.emacs-china.org/org/"))))
(defvar myPackages
'(better-defaults
ein ;; add the ein package (Emacs ipython notebook)
elpy
flycheck
material-theme
py-autopep8
conda))
;; 初始化
(package-initialize)
;; 文件末尾
(provide 'init-packages)
C-c C-c 还是 python-send-shell-buffer
,那要如何才能用elpy.el默认的快捷键?
抱歉,我那天傻了,忘记加 (elpy-enable)
了。
最小配置貌似路径没有问题
;;; emacs -Q -l ~/.config/emacs/test.el
(package-initialize)
(require 'elpy)
(elpy-enable)
尝试步骤:
- 新建 toy 项目如下:
-
emacs -Q -l ~/.config/emacs/test.el
打开 Emacs - 打开 main.py
#!/usr/bin/env python
import os
print(os.getcwd())
- C-c C-c 输出结果显示是在项目根目录下运行
/Users/myname/Developer/toy-project
(elpy-enable)
这个我配置文件一开始就设置好的,仍然找不到项目根目录下的模块。
你要按照我上面的最小步骤走啊😢。。。 现在是你说有问题别人无法复现,你让别人怎么帮你
因为可能和别的有冲突,所以你要用最小配置,如果最小配置没问题,你就需要二分你的配置。如果最小配置也有问题,那就带上详细信息(项目结构,最小配置,系统信息,Emacs 版本)来反馈 bug。问题在你那这些事情是需要你做的,而不是一句简单的找不到模块(模块是咋样的,能像我一样用个 toy example 么展示么,有没有可能本身就是 Pycharm 做了特殊处理),我的快把模板摆在你面前了你都不会抄(照着我的步骤走一遍)。
在未能提供有效信息前不会回复了,如果上面对你说太难了回去用 Pycharm 挺好的
如果使用elpy
建议看一下 GitHub - redguardtoo/emacs.d: Fast and robust Emacs setup. , 要点就是emacs作为开发工具需要的python环境和生产代码需要的python环境是互相独立的(也许生产代码的部分包可以在开发环境中可见)。
可以事先看一些python module search path的文档( 6. Modules — Python 3.11.1 documentation ),了解shell和命令行的一些基本知识也不错。见 命令行和shell的几本免费电子书 - 知乎
另外在 Elpy can not find flake8 on Windows 10 - Emacs Stack Exchange 我回答了windows上elpy相关问题。基本就是对elpy官方文档的解读,没有什么新东西。
谢谢楼上,我是用elpy.el配合conda.el使用的。