Я хотел бы знать, что лучше всего, когда вы хотите «вернуть» что-то из скрипта python.Python subprocess.Popen: sys.stdout vs .txt file vs Cpickle.dump
Вот моя проблема. Я запускаю Python childScript из родительского кода, используя метод subprocess.Popen. Я хотел бы получить кортеж двух поплавков от выполнения первого скрипта.
Теперь, первый метод я видел, используя sys.stdout и трубу в функции подпроцесса следующим образом:
child.py:
if __name__ == '__main__':
myTuple = (x,y)
sys.stdout.write(str(myTuple[0]) +":"+str(myTuple[1]))
sys.stdout.flush()
parent.py:
p = subprocess.Popen([python, "child.py"], stdout=subprocess.PIPE)
out, err = p.communicate()
Хотя here он говорит, что не рекомендуется в большинстве случаев, но я не знаю, почему ...
Второй способ - написать мой кортеж в текстовый файл в Script1.py и открыть его в Script2.py. Но я думаю, что писать и читать файл занимает немного времени, поэтому я не знаю, лучше ли это делать?
Наконец, я мог бы использовать CPickle и сбросить свой кортеж и открыть его с script2.py. Я предполагаю, что это будет немного быстрее, чем использование текстового файла, но будет ли это лучше, чем использование sys.stdout?
Что было бы правильным способом?
--------------------------------------- EDIT ------ ------------------------------------------
Я забыл упомянуть что я не могу использовать импорт, поскольку parent.py фактически генерирует child.py в папке. Действительно, я делаю многопроцессорную обработку.
Parent.py создает 10 каталогов, в которых child.py копируется в каждом из них. Затем я запускаю каждый из child.py из parent.py на нескольких процессорах. И я хочу, чтобы parent.py собирал результаты, «возвращенные» всем child.py. Таким образом, parent.py не может импортировать child.py, поскольку он еще не создан, или, может быть, я могу сделать какой-то динамический импорт? Я не знаю ...
-------------------------------------- -EDIT2 -----------------------------------------------
Другое редактирование, чтобы ответить на вопрос относительно того, почему я продолжаю этот путь. Child.py на самом деле вызывает ironpython и другой скрипт для запуска сборки .NET. Причина, по которой я должен копировать все файлы child.py в определенных папках, состоит в том, что эта сборка генерирует файл ресурсов, который затем используется сам по себе. Если я не копирую child.py (и сборку кстати) в каждой подпапке, файлы ресурсов копируются в корневой каталог, который создает конфликты при вызове нескольких процессов с использованием модуля многопроцессорности. Если у вас есть предложения об этой общей архитектуре, то это более чем приветствуется :).
Благодаря
неродственного: в общем, 'script1.py',' script2.py', 'float1',' float2' не являются хорошими именами. Вы можете использовать 'child.py',' parent.py' для скриптов, если на ум не приходит ничего конкретного, а 'numbers' или' x, y' для чисел. – jfs
Хорошо, я редактирую/дополняю его прямо сейчас. Спасибо! – Serge