Emacs:在缓冲区评估时向下级Python shell传递参数

7 投票
1 回答
2611 浏览
提问于 2025-04-15 23:08

最近我开始用Emacs作为Python的开发环境,但感觉不是很直观……我现在遇到的问题是,当我用C-c C-c来运行代码时,怎么把命令行参数传给下面的Python解释器。谢谢大家的帮助。

1 个回答

7

这件事看起来不太容易做到;由 python.el 模块管理的子进程是设计成可以在多次调用 python-send-buffer(以及其他相关命令)时持续存在的。一个我找到的解决办法是,自己写一个函数,从子进程内部程序化地设置 sys.argv

(defun python-send-buffer-with-my-args (args)
  (interactive "sPython arguments: ")
  (let ((source-buffer (current-buffer)))
    (with-temp-buffer
      (insert "import sys; sys.argv = '''" args "'''.split()\n")
      (insert-buffer-substring source-buffer)
      (python-send-buffer))))

你可以在你的 *scratch* 缓冲区中执行这个函数,或者把它保存到你的 .emacs 文件里。如果你想的话,还可以把它绑定到一个方便的快捷键上。C-c C-a 这个组合键似乎在 python-mode 中没有被使用,所以你可以试试:

(global-set-key "\C-c\C-a" 'python-send-buffer-with-my-args)

这个命令会提示你输入要使用的参数,然后把你的源代码缓冲区复制到一个临时缓冲区,并在前面加上一个代码片段,这个片段会把 sys.argv 设置为你提供的参数列表,最后会调用 python-send-buffer

上面的代码只是简单地根据空格来分割你输入的字符串,所以如果你需要提供的参数中有空格,你就需要一个更复杂的算法来处理了。

撰写回答