2013-08-21 3 views
1

Я хочу запланировать вычисление после того, как мои текущие вычисления в Python закончены. Обратите внимание, что мой интерпретатор Python работает через emacs.Python и вычисление вычислений

Например я в настоящее время работаю:

>>> 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, дайте мне знать, если вам нужна дополнительная информация. Вся помощь очень ценится!

EDIT: Мне понравился ответ, однако я не знаю, как найти ПИД. Я использую интерпретатор Python через emacs. Так как я могу это узнать?

+2

ли вам на самом деле нужно запланировать следующий Python или просто запустить его, как только текущая команда будет завершена? В последнем случае просто введите команду в буфере Python и нажмите enter. Он будет отправлен на Python, как только он закончит текущую команду. Или, по крайней мере, именно так Emacs работает в буферах оболочки или R. Если вы используете оболочку bash или режим Python, основанный на режиме comint, он должен работать одинаково. – Tyler

+0

может быть совершенно другой подход: если задача, которую вы выполняете, накладывает большую нагрузку на ваш процессор, найдите это (например, с помощью топ-команды), запустите другую задачу, когда загрузка была достаточно длинной :) – benjamin

ответ

0

Я думаю, что самый простой способ - написать еще один скрипт, который ждет, пока ваш процесс не завершится и запустится tn.TweetNetwork.create_subnetworks(1). Это будет работать только в том случае, если ваш create_subnetworks не имеет доступа к глобальным переменным и не делает и не записывает все результаты в базу данных/файл/etc.

# 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, получить идентификатор процесса по ps axu | grep script_name и запустить этот новый сценарий.

+0

Как сделать Я получаю SCRIPT_PID? Я запускаюсь в emacs ... – CodeKingPlusPlus

+0

Посетите ваш сервер через tramp 'C-x C-f/ssh: user @ server: /', запустите 'M-x eshell' и выполните' ps axo pid, command | grep running_script_name'. – werehuman

+0

Я не уверен, что у меня есть 'running_script_name'. Это означает, что я импортирую модуль, а затем запускаю функции в модуле из интерпретатора. – CodeKingPlusPlus

1

Это было слишком много для комментария, но это не полный ответ.

Чтобы получить процесс, начатый Emacs:

  1. M-х список-процессов,
  2. идентифицировать процесс, который вы хотите получить идентификатор
  3. M-:(process-id (get-process "name-of-the-process")).

Но это даст вам процесс интерпретатора, а не какой-либо другой процесс, начатый с него.

Если вы после этого нужно, чтобы все процессы породили через этот процесс, вы можете сделать:

$ pstree PID 

Где PID это один вы получили ранее из Emacs.

0

Если Тайлер комментарий не помогает, вы можете Eval следующий фрагмент кода:

(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, в вашем случае) пишет что-либо.В вашем случае это будет приглашение «>>>», которое питон записывает при готовности. Если ваш код генерирует выходные данные, этот подход не будет работать.

Если вы используете Comint в других буферах (оболочку, SQL, ...) вам нужно будет сделать переменную comint-output-filter-functions локальным для питона интерактивного буфера (с make-variable-buffer-local)

+0

emacs белый-магия ^^ – benjamin

Смежные вопросы