Запускать программы в фоновом режиме из Mathematica - PullRequest
4 голосов
/ 05 июля 2011

Есть ли способ создать фоновый процесс в Mathematica, чтобы внешняя команда выполнялась, но не задерживала другие вычисления?

startTime = AbsoluteTime[];
Run["sleep 2" (*, a magic option here perhaps? *)];
AbsoluteTime[] - startTime
(* Returns 2.016960 on my system *)

Я хочу версию / option для Run, которая не будет задерживать оценку, так что последняя строка в приведенном выше коде вернет что-то близкое к нулю.

(Вышеприведенное будет работать в * nix и OSX; похоже, не существует универсального / переносимого способа «уснуть 2» в оболочке DOS / Windows: Спящая в пакетном файле . Хотя, возможно, самый простой способ получить команду sleep - это установить комплект ресурсов MS - см. этот ответ на Sleeping in batch file question или комментарии ниже.)


В настоящий момент я хочу, чтобы причина в том, что моя ALSASound команда, указанная в Нет звука в Mathematica под linux , не остановит fireworks . Но это также будет хорошим улучшением ALSASound и полезной вещью, которую нужно знать в целом.


Редактировать

Два решения, представленные ниже, используют оболочку для создания нового / дочернего процесса, используя start cmd в Windows / DOS и cmd& в * nix. Существует ли независимое от платформы решение и / или решение на основе Mathematica? (Очки будут начислены за создание команды, которая проверяет ОС, используя $OperatingSystem!)

Ответы [ 3 ]

4 голосов
/ 05 июля 2011

Как указывает Саймон, Switch является правильным инструментом для процедурных условий и более подходит, чем Piecewise.Вот то же решение, использующее Switch:

BackgroundProcess[proc_String] := 
  Switch[$OperatingSystem, 
    "MacOSX" | "Unix", Run["(" <> proc <> ")&"], 
    "Windows", Run["start /b " <> proc],
     _, $Failed]

. Вы можете написать функцию-оболочку, например, которая обрабатывает несколько ОС.

BackgroundProcess[proc_String] := 
 Module[{
  command = Piecewise[{
       {proc <> " &", $OperatingSystem == "MacOSX" || "Unix"}, 
       {"start /b " <> proc, $OperatingSystem == "Windows"}
     }]
    }, 
  Run[command]]

/b после start запускает процесс в фоновом режиме, не вызывая нового командного окна, и вывод выводится на стандартный вывод.Затем вы можете опираться на это, чтобы включить сообщения об ошибках, некоторую дезинфекцию ввода (например, не разрешать rm и т. П.), Если хотите, и все должно быть настроено.

Предопределенная функция изMathematica (если она существует), вероятно, будет в том же духе.Фоновые процессы по своей природе зависят от ОС, поэтому не существует реального «независимого от платформы» способа сделать это.Любая реализация, которая претендует на это (например, модуль os в python), в основном представляет собой набор правил, определенных для каждой возможной известной ОС, так что вам не нужно беспокоиться о мелких деталях.

1 голос
/ 05 июля 2011

В Windows (я понял, что вы пытаетесь сделать ??)

startTime = AbsoluteTime[];
Run["start notepad"];
AbsoluteTime[] - startTime
(*
-> 0.1406250
*)

Редактировать

По причинам переносимости я не думаю, что Mma должна принимать на себя определенные функции базовой ОС. Достаточно иметь стандартный ввод и вывод и командную оболочку, вызываемую изнутри программы. Как только вы передадите управление выбранной вами оболочке ОС, делайте все, что хотите (например, наберите start или отправьте &), или то, что позволяет вам ваша ОС.

0 голосов
/ 05 июля 2011

Хотя я не знаю, как это сделать в Mathematica, есть очень простое решение BASH / shell: просто создайте дочерний процесс, используя "&" .

Тогда

startTime = AbsoluteTime[];
Run["(sleep 20)&"];
AbsoluteTime[] - startTime
(* Returns approx 0.01 *)

Аналогичное решение работает с моей командой ALSASound, и я обновил свой ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...