Sono in esecuzione Windows 7, versioni JMP 12, 13, 14 e 15.
Sto osservando problemi in JMP15 con script "wrapper" che contengono codice per eseguire sequenzialmente altri script subordinati / nidificati.
Questi script sono stati scritti nelle versioni precedenti alla 15 ed eseguiti correttamente lì. Alcune - ma non tutte - di queste raccolte di script wrapper / nidificati non vengono eseguite correttamente in JMP15.
Ognuno degli script separati viene eseguito correttamente in JMP15 se eseguito singolarmente.
Mi scuso in anticipo per non essere stato in grado di inviare un set completo di script, ma ho fornito esempi generici di entrambi i tipi.
Lo script 'wrapper' è di forma generica:
//start wrapper.jsl
names default to here(1);
close all (data tables, no save);
clear log();
subordinate_scripts = {"subord1.jsl","subord2.jsl","subord3.jsl","subord4.jsl"};
for( i = 1, i <= n items(subordinate_scripts), i++,
beacon = 1; //variable gets set to 0 by last line of subordinate script
open(subordinate_scripts[i]);
if(beacon !=0,
write("\!NScript "||subordinate_scripts[i]||" did not successfully execute to completion.";
throw();
);
);
//end wrapper.jslGli script nidificati subord1.jsl, ecc. sono di forma generica
//! //start subord script so it will auto-execute when opened by wrapper.jsl
/* bunch of stuff, e.g.
aggregating multiple files
database queries
data processing / reshaping
saving large files
building extensive reports in the journal
executing other scripts
*/
beacon = 0;
//end subord script
Lo script subordinato segnala l'esecuzione completa dello script wrapper modificando il valore di beacon su 0 come ultima istruzione.
Se beacon == 0, lo script wrapper avvia il ciclo successivo del ciclo FOR e apre il successivo script subordinato.
Quello che ho visto in JMP15 suggerisce il seguente ordine di eventi:
- viene avviato lo script wrapper
- faro impostato su 1
- inizia il primo script subordinato
- lo script wrapper NON attende il completamento dello script subordinato.
- l'esecuzione dello script wrapper continua con l'istruzione IF.
- beacon == 1
- il messaggio viene stampato dicendo che lo script subordinato non è riuscito (si noti che lo script subordinato è già in esecuzione a questo punto)
- lo script wrapper si interrompe
- lo script subordinato termina l'esecuzione correttamente.
- Lo script subordinato successivo non viene aperto perché il wrapper si è arrestato
Il solito ordine di eventi nelle versioni precedenti a JMP15 è
- inizia il wrapper
- wrapper sets beacon = 1
- wrapper apre lo script subordinato, quindi resta inattivo fino al termine dello script subordinato
- viene eseguito lo script subordinato, impostando beacon = 0 come ultima istruzione
- lo script wrapper controlla il valore beacon.
- poiché beacon == 0, viene eseguito il ciclo successivo del ciclo FOR.
- tutti gli script subordinati vengono eseguiti in sequenza.
Qualcuno ha un suggerimento per far funzionare questo idioma di scripting in JMP15?
Grazie in anticipo.
sembra che dovresti usare
includere()
invece di
Aperto()
Qualche idea sul perché open () e include () non sono più intercambiabili?
Immagino: la variabile beacon è talvolta locale per il sotto-script. Forse NamesDefaultToHere è coinvolto. Un test rapido suggerisce che JMP 15 fa honor NamesDefaultToHere che rende il beacon locale al sub-script quando JMP 14 no. @EvanMcCorkle @audrey_shull
file=savetextfile("$temp/xxx.jsl","//!
namesdefaulttohere(1);
xyzzy=42;show(xyzzy)");
open(file);
show(xyzzy);Come Vince, userei includere() piuttosto che Aperto() per questo perché non ha bisogno del //! .
Puoi anche usare :: beacon per renderlo una variabile globale.
Oppure rimuovi NamesDefaultToHere dagli script secondari che lo hanno.
Grazie per la risposta, Craige. Altri buoni consigli che implementerò. Molto apprezzato.