自定义Python shell适用于Emacs python-mode

6
需要用自定义的python shell替换Emacs的python-mode中的常规/usr/bin/python,该怎么做?
基本上,我有一个二进制文件/usr/bin/mypython,在启动python解释器提示之前进行一些初始化。对于所有交互目的,生成的解释器shell等效于/usr/bin/python。
但是,如果我在“python-python-command”中指定此二进制文件(在Emacs 23.3中使用python.el),则会出现“仅支持Python版本> = 2.2和<3.0”。
3个回答

5

我即将查看elisp代码,但我敢打赌如果你加入一个--version标志,并给出与/usr/bin/python相同的保存结果,emacs将会很高兴。

更新

以下是EMACS 23.3.1中python.el第1555行及其后续代码:

(defvar python-version-checked nil)
(defun python-check-version (cmd)
  "Check that CMD runs a suitable version of Python."
  ;; Fixme:  Check on Jython.
  (unless (or python-version-checked
          (equal 0 (string-match (regexp-quote python-python-command)
                     cmd)))
    (unless (shell-command-to-string cmd)
      (error "Can't run Python command `%s'" cmd))
    (let* ((res (shell-command-to-string
                 (concat cmd
                         " -c \"from sys import version_info;\
print version_info >= (2, 2) and version_info < (3, 0)\""))))
      (unless (string-match "True" res)
    (error "Only Python versions >= 2.2 and < 3.0 are supported")))
    (setq python-version-checked t)))

它正在执行一条简短的命令。
from sys import version_info;
print version_info >= (2, 2) and version_info < (3, 0)

你的脚本只是简单地打印出"True" 或者 "False"。修复一下你的脚本来处理-c标记,就可以解决问题了。

另外,你也可以采取“黑客”的方式,强制把python-version-checked的值设为t,这样就不会进行检查了。


感谢指针,浏览文件时我发现另一个问题——"-i"标志是硬编码的(因此从python-python-command-args中删除它不会阻止其传递)。 - Yaroslav Bulatov
这就是为什么他们提供源代码给你的原因。但是,特别是那个问题听起来像是一个漏洞;修改它并提交一个补丁。 - Charlie Martin

1

打败检查最简单的方法是撒谎告诉python-check-version它已经被检查过了:

(setq python-version-checked t)

0

欢迎来到StackOverflow!我看到你很热情并且有一个喜爱的工具。然而,在所有帖子中推荐或链接到同一网站,并且在第一天内就这样做了10次,可能会触发本站的“潜在垃圾邮件”信号。所以请小心!这只是友好的建议。 - Bo Persson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接