emacs里如何设置python项目的根目录?

我在emacs里运行python文件,总是提示找不到项目根目录下的自编模块,有没有办法设置这个项目根目录?就像pycharm里面一样,把项目根目录设置为source root,就可以直接调用根目录下的自编模块。

不知道你咋运行的,可以通过 .dir-locals.el 设置下面几个项目相关路径

我安装了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(而不是像这个帖子一样只说个不行)

1 个赞

没关系的,谢谢你。教程我在慢慢看。我看了一些帖子,在根目录建了.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)

尝试步骤:

  1. 新建 toy 项目如下:
  2. emacs -Q -l ~/.config/emacs/test.el 打开 Emacs
  3. 打开 main.py
#!/usr/bin/env python
import os
print(os.getcwd())
  1. 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官方文档的解读,没有什么新东西。

1 个赞

谢谢楼上,我是用elpy.el配合conda.el使用的。