2017-10-05 12 views
1

Voici ce que je veux faire:exécuter plusieurs scripts python de Stata en même temps

  1. Appel sur 8 scripts python de Stata simultanément (pour gagner du temps, si elle est exécutée de manière séquentielle, ils prennent trop de temps). Je sais comment appeler un:

    shell "C: /Python34/python.exe" "A:/mon code/Test.py"

  2. Have Stata attendre jusqu'à ce qu'ils finissent tous, puis faire des choses à l'intérieur Stata.

Est-il possible d'appeler plusieurs scripts Python simultanément?

+2

Vous pouvez WinExec (plutôt que shell) le premier k-1 et shell le kth. Cela ne fonctionnera pas si le kth prend beaucoup moins de temps que certains autres. Sinon, jetez un coup d'œil à -parallel-. –

+0

Je pense que cela fonctionnerait bien, surtout parce que je peux choisir celui qui prend le plus de temps et ajouter une commande d'attente pour un tampon. Merci! – RandomCat

+0

Une autre option serait d'écrire une boucle while qui vérifie la sortie des scripts python, avec une commande sleep qui se déclenche quand ils n'existent pas tous. –

Répondre

2

Je n'ai pas accès à une machine Windows, mais quelque chose comme ça pourrait faire l'affaire. Changez la deuxième partie pour correspondre à ce que vous faites avec Python.

/* (1) Instead of Python scripts, count some files and store the counts */ 
winexec rm "/Users/dimitriy/*_count.txt" 
winexec find /Users/dimitriy -type f -name '*.ado' | wc -l > ado_count.txt 
winexec find /Users/dimitriy -type f -name '*.pdf' | wc -l > pdf_count.txt 
winexec find /Users/dimitriy -type f -name '*.do' | wc -l > do_count.txt 


/* (2) Wait for ALL 3 files to be generated since Stata does not wait for winexec commands to finish */ 
capture ssc install fs, replace 

while "`num_files'" != "3" { 
    local num_files: word count `r(files)' 
    sleep 10000 // sleep 10 seconds 
    fs *_count.txt 
} 

di "All Done!" 

Réponse au commentaire ci-dessous:

Cela n'a pas de sens et ne fonctionnera pas pour une foule de raisons. Je supposais que vos scripts Python cracher 8 fichiers de sortie. Puisque je ne sais pas ce qu'ils sont, j'ai essayé d'utiliser 3 commandes Mac qui produisent trois fichiers pour me donner quelque chose à travailler à l'étape 1. L'étape 2 vérifie que ces 3 fichiers existent avant de continuer.

En supposant que chaque script Python i produit un fichier appelé output_i.txt pour i = 1, .., 8, vous aurez besoin d'avoir quelque chose comme ceci:

forvalues v=1/8 { 
    winexec "C:/Python34/python.exe" "D:/my code/PythonCode`v'.py" 
} 

capture ssc install fs, replace 

while "`num_files'" != "8" { 
    local num_files: word count `r(files)' 
    sleep 10000 // sleep 10 seconds 
    fs output_*.txt 
} 
+0

'fs' ici doit être installé en utilisant' ssc install fs' avant que le code ne s'exécute. –

+1

@NickCox Un jour je m'en souviendrai! Merci d'avoir encore attrapé cela. –

+0

Une commande écrite par l'utilisateur a réussi si elle fait partie du répertoire standard d'un autre utilisateur. C'est flatteur. Mais cela n'aide pas les utilisateurs qui ne savent pas d'où ça vient! –