Одновременно запускайте несколько скриптов Python из Stata.

Вот что я хочу сделать:

  1. Вызовите около 8 python-скриптов из Stata одновременно (для экономии времени; при последовательном выполнении они занимают слишком много времени). Я знаю, как позвонить одному:

    оболочка "C:/Python34/python.exe" "A:/мой код/Test.py"

  2. Попросите Stata подождать, пока они ВСЕ закончат, а затем сделайте что-нибудь внутри Stata.

Можно ли одновременно вызывать несколько скриптов Python?


person RandomCat    schedule 05.10.2017    source источник
comment
Вы можете выполнить winexec (а не шелл) первого k-1 и шеллить kth. Это не сработает, если kth занимает намного меньше времени, чем некоторые другие. В противном случае взгляните на -parallel- .   -  person Dimitriy V. Masterov    schedule 06.10.2017
comment
Я думаю, что это сработает, особенно потому, что я могу выбрать тот, который занимает больше всего времени, и добавить команду ожидания для буфера. Спасибо!   -  person RandomCat    schedule 06.10.2017
comment
Другим вариантом было бы написать цикл while, который проверяет выходные данные сценариев Python, с командой сна, которая срабатывает, когда они не все существуют.   -  person Dimitriy V. Masterov    schedule 06.10.2017
comment
Я пробовал -параллельно- и это не сработало. Он вышел без ошибок, но код явно не запустился. Интересно, оболочка не работает с параллельным? Кроме того, вы хотите написать свое решение в качестве ответа, чтобы я мог его принять?   -  person RandomCat    schedule 08.10.2017


Ответы (1)


У меня нет доступа к машине с Windows, но что-то вроде этого может помочь. Измените вторую часть, чтобы она соответствовала тому, что вы делаете с 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!"

Ответ на комментарий ниже:

Это не имеет смысла и не будет работать по целому ряду причин. Я предполагал, что ваши сценарии Python выдают 8 выходных файлов. Поскольку я не знаю, что это такое, я попытался использовать 3 команды Mac, которые создают три файла, чтобы дать мне что-то для работы на шаге 1. Шаг 2 проверяет, что эти 3 файла существуют, прежде чем продолжить.

Предполагая, что каждый скрипт Python i создает файл с именем output_i.txt для i=1,..,8, вам понадобится что-то вроде этого:

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
}
person Dimitriy V. Masterov    schedule 09.10.2017
comment
fs здесь необходимо установить с помощью ssc install fs, прежде чем код запустится. - person Nick Cox; 09.10.2017
comment
@NickCox Когда-нибудь я это запомню! Спасибо, что поймали это еще раз. - person Dimitriy V. Masterov; 09.10.2017
comment
Написанная пользователем команда считается успешной, если она становится частью стандартного репертуара другого пользователя. Это лестно. Но это не помогает пользователям, которые не понимают, откуда оно взялось! - person Nick Cox; 09.10.2017
comment
Я думал, что это работает, но файл do так и не был запущен, потому что текстовые файлы не генерировались. Так что я, должно быть, не понял, что вы сказали. Что я сделал, так это заменил (1) скриптами Python (например, winexec C:/Python34/python.exe D:/my code/PythonCode1.py | wc -l › Code1_count.txt), и я подумал, что когда они будут работать , будет создан текстовый файл. Не могли бы вы пояснить свое решение? - person RandomCat; 11.10.2017
comment
Спасибо, это имеет большой смысл! Извините, что туплю. Я не новичок в Stata, но раньше никогда не пользовался winexec. - person RandomCat; 11.10.2017