Emacs 在python-mode.el中打开C-C-C上的新python shell

Emacs 在python-mode.el中打开C-C-C上的新python shell,emacs,python-mode,Emacs,Python Mode,我有一个小型GTK python应用程序,它导入一个包(Twisted),该包可能不会被加载两次 如果我使用python-mode.el在emacs中运行我的应用程序并按C-C-C,那么该应用程序将在pythonshell窗口中执行。 如果现在关闭应用程序,pythonshell将保持运行状态。如果我现在再次按下C-C-C,emacs会“重用”旧的python进程,因此我会遇到问题,因为我要安装两次Twistedreactor 是否可以让python-mode.el在每次执行缓冲区时打开一个新的

我有一个小型GTK python应用程序,它导入一个包(Twisted),该包可能不会被加载两次

如果我使用python-mode.el在emacs中运行我的应用程序并按C-C-C,那么该应用程序将在pythonshell窗口中执行。 如果现在关闭应用程序,pythonshell将保持运行状态。如果我现在再次按下C-C-C,emacs会“重用”旧的python进程,因此我会遇到问题,因为我要安装两次Twistedreactor


是否可以让python-mode.el在每次执行缓冲区时打开一个新的shell窗口?

python.el
中,如果
python buffer
变量设置为
nil
,将在新缓冲区中启动一个新的低级进程。因此,可以建议
python send buffer
函数在每次调用后将该变量重置为
nil
,从而强制为后续的
python send buffer
命令执行新的python进程。类似于以下的方法应该可以工作:

(defadvice
  python-send-buffer
  (after python-send-buffer-new-proc activate)
  (setq python-buffer nil))

(ad-activate python-send-buffer)
我知道你的帖子要求你帮助
python mode.el
,但我认为不管怎样提及这一点可能会有所帮助,因为如果
python mode.el
没有使用类似的机制,我会感到惊讶。如果我有时间,我会设法调查此事

编辑:
python mode.el
包使用命令
pyshell
启动一个新的python进程。我发现其中一个用户提供了一个临时功能,似乎可以做您需要的事情


顺便说一句,可能值得考虑的是,试图改变
python模式的默认行为并不是解决此问题的最佳方法。我不知道你的代码是做什么的,我对Twisted也不是特别熟悉,但在我看来,在同一个会话中第二次评估代码时遇到重大错误可能是一个更基本的设计问题的迹象。我看不出同一个模块的多个
导入如何成为问题,因为Python模块只加载一次,连续的
import
语句无效(为此,需要显式的
reload
execfile()
)。如果我在这里完全不正确,我很抱歉,但我觉得这种可能性可能值得一提。

python-mode.el附带一个命令py-execute buffer专用,
为它打开一个新的保留流程

谢谢,这帮了大忙。对于扭曲问题:我从Twisted.internet导入gtk3reactor gtk3reactor.install()
,按照Twisted手册执行,这会在第二次评估时导致问题。是否有一种标准的方法来检查模块之前是否已导入?@gnirx,通常情况下,第二次导入模块不会产生任何影响,如果确实有一些影响,特别是产生错误的影响,则可能表明代码应该以某种方式重新构造。这就是说,也许你的情况是个例外——我对Twisted的细节了解不够,因此无法确定。如果确实要检查模块是否已导入,
import sys
并检查它是否存在于
sys.modules
中。请记住,这通常被认为是笨拙的,如果可能的话最好避免。