Exécuter des programmes en arrière-plan à partir de Mathematica

Existe-t-il un moyen de créer un processus d’arrière-plan dans Mathematica afin que la commande externe s’exécute sans bloquer d’autres évaluations?

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

Je veux une version de / option pour Run qui ne retiendra pas l’évaluation, de sorte que la dernière ligne du code ci-dessus renverra quelque chose proche de zéro.

(Ce qui précède s’exécutera dans * nix et OSX; il ne semble pas y avoir de moyen universel / portable pour “dormir 2” dans un shell DOS / Windows: dormir dans un fichier de commandes . sleep commande sleep consiste à installer le kit de ressources MS – voir cette réponse à la question Sleeping in a batch ou aux commentaires ci-dessous.)


Pour le moment, la raison pour laquelle je veux ceci est que ma commande ALSASound donnée dans No sound in Mathematica sous linux n’arrête pas le feu d’artifice . Mais ce serait aussi une bonne amélioration pour ALSASound et une chose utile à savoir en général.


modifier

Les deux solutions affichées ci-dessous reposent sur l’utilisation du shell pour générer un nouveau processus / enfant en utilisant start cmd sous Windows / DOS et cmd& in * nix. Existe-t-il une solution indépendante de la plate-forme et / ou de Mathematica? (Des points seront atsortingbués pour la création d’une commande qui vérifie le système d’exploitation à l’aide de $OperatingSystem !)

Comme le souligne Simon, Switch est l’outil approprié pour les conditions procédurales et convient mieux que Piecewise . Voici la même solution en utilisant Switch :

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

Vous pouvez écrire une fonction wrapper comme celle qui gère plusieurs systèmes d’exploitation.

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

Le /b après le start exécute le processus en arrière-plan, sans créer une nouvelle fenêtre de commande et la sortie est imprimée sur stdout. Vous pouvez ensuite vous baser sur ceci pour inclure des messages d’erreur, une vérification des entrées (par exemple, ne pas autoriser rm et autres) si vous le voulez, et vous devriez être tous prêts.

Une fonction prédéfinie de Mathematica (si elle existait) va probablement suivre ces lignes. Les processus d’arrière-plan dépendent insortingnsèquement du système d’exploitation, il n’y a donc pas de véritable méthode indépendante de la plateforme. Toute implémentation prétendant l’être (comme le module os dans python) est fondamentalement un ensemble de règles définies pour chaque système d’exploitation possible, de sorte que vous n’avez pas à vous soucier des détails les plus fins.

Sous Windows (Ai-je compris ce que vous essayez de faire ??)

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

modifier

Pour des raisons de portabilité, je ne pense pas que Mma devrait assumer des fonctionnalités particulières du système d’exploitation sous-jacent. Avoir une entrée et une sortie standard et un shell de commande appelable depuis un programme suffit. Une fois que vous avez obtenu le contrôle du shell de votre choix, faites ce que vous voulez ( start ou envoyer un appel, par exemple) ou ce que votre système d’exploitation vous permet de faire.

Bien que je ne connaisse pas de méthode Mathematica, il existe une solution BASH / shell très simple: créez simplement un processus enfant en utilisant ” & ” .

alors

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

Une solution similaire fonctionne avec ma commande ALSASound et j’ai mis à jour ma réponse .