1

我希望在我当前在 Python 中的计算完成后安排一次计算。请注意,我的 Python 解释器是通过 emacs 运行的。

例如我目前正在运行:

>>> for i in range(2, 5):
...     tn.TweetNetwork.create_subnetworks(i)
... 

我犯了一个简单的错误,打算输入range(1,5). 这已经运行了至少 4 个小时,应该再运行几个小时。话虽如此,我不想重新执行带有更正的循环并丢失所有已计算的内容。

由于我不是 24/7 计算机,我如何安排 Python 执行函数 `tn.TweetNetwork.create_subnetworks(1)?

我使用 emacs 24.3 和 ubuntu 12.04 LTS,如果您需要更多信息,请告诉我。非常感谢所有帮助!

编辑:我喜欢发布的答案,但是我不知道如何找到 PID。我正在通过 emacs 运行 Python 解释器。那我怎么发现呢?

4

3 回答 3

1

这对评论来说太多了,但这不是一个完整的回复。

要让 Emacs 启动一个进程:

  1. M-x list-processes,
  2. 确定要获取其 id 的进程
  3. M-:(process-id (get-process "name-of-the-process")).

但这会给你解释器的进程,而不是从它开始的任何其他进程。

如果您随后需要通过该进程生成所有进程,您可以执行以下操作:

$ pstree PID

PID您之前从 Emacs 获得的那个在哪里。

于 2013-08-25T19:24:41.563 回答
0

如果 Tyler 的评论没有帮助,您可以评估以下代码:

(defun foo (ignored)
  (remove-hook 'comint-output-filter-functions 'foo)
  (run-with-timer 1 nil (lambda()
                          (goto-char (point-max))
                          (insert "tn.TweetNetwork.create_subnetworks(1)")
                          (comint-send-input))))

(add-hook 'comint-output-filter-functions 'foo)

它定义了一个函数,该函数将在调用该函数后一秒钟将您需要插入的命令插入到 python 下级缓冲区中(延迟是为了避免递归循环)。

然后它在下级进程(python,在你的情况下)写任何东西的事件上设置该函数的调用。在您的情况下,这将是 >>>" 提示,python 在准备好时写入。如果您的代码正在生成输出,则此方法将不起作用。

如果您在其他缓冲区(shell、sql、...)中使用 comint,则需要将变量 comint-output-filter-functions设置为 python 交互式缓冲区的本地变量(使用make-variable-buffer-local

于 2013-08-26T15:44:57.127 回答
0

我认为,最简单的方法是编写另一个脚本,等待您的进程完成并运行tn.TweetNetwork.create_subnetworks(1)。这仅在您create_subnetworks不访问任何全局变量并将所有结果写入数据库/文件/等时才有效。

# Write script similar to these
import os, time

print "Wait until old script completed..."
while os.path.exists("/proc/SCRIPT_PID"):
    time.sleep(1)

print "Execute create_subnetworks..."
tn = ...
tn.TweetNetwork.create_subnetworks(1)

通过 SSH 连接到您的计算机,获取进程 IDps axu | grep script_name并运行这个新脚本。

于 2013-08-21T03:35:00.360 回答