एनबी। मैंने Log output of multiprocessing.Process देखा है - दुर्भाग्यवश, यह इस प्रश्न का उत्तर नहीं देता है।पायथन मल्टीप्रोसेसिंग: मैं बाल प्रक्रिया से विश्वसनीय रूप से स्टडआउट कैसे रीडायरेक्ट कर सकता हूं?
मैं मल्टीप्रोसेसिंग के माध्यम से एक बाल प्रक्रिया (विंडोज़ पर) बना रहा हूं। मैं कंसोल पर दिखाई देने के बजाय, बाल प्रक्रिया के stdout और stderr आउटपुट के सभी को लॉग फ़ाइल पर रीडायरेक्ट करने के लिए चाहता हूं। एकमात्र सुझाव मैंने देखा है कि बच्चे की प्रक्रिया के लिए sys.stdout को फ़ाइल में सेट करना है। हालांकि, यह विंडोज़ पर stdout पुनर्निर्देशन के व्यवहार के कारण, सभी stdout आउटपुट को प्रभावी ढंग से पुनर्निर्देशित नहीं करता है।
समस्या को वर्णन करने के लिए निम्न कोड
#include <iostream>
extern "C"
{
__declspec(dllexport) void writeToStdOut()
{
std::cout << "Writing to STDOUT from test DLL" << std::endl;
}
}
तो बना सकते हैं और निम्नलिखित है, जो इस DLL का आयात करता है और फ़ंक्शन को कॉल की तरह एक अजगर स्क्रिप्ट चलाने के साथ Windows DLL का निर्माण:
from ctypes import *
import sys
print
print "Writing to STDOUT from python, before redirect"
print
sys.stdout = open("stdout_redirect_log.txt", "w")
print "Writing to STDOUT from python, after redirect"
testdll = CDLL("Release/stdout_test.dll")
testdll.writeToStdOut()
मेरे जैसा ही व्यवहार देखने के लिए, संभवतः डीएलएल को एक पायथन उपयोग के मुकाबले एक अलग सी रनटाइम के खिलाफ बनाया जाना आवश्यक है। मेरे मामले में, अजगर विजुअल स्टूडियो 2010 के साथ बनाया गया है, लेकिन मेरे DLL वी.एस. के साथ बनाया गया है 2005
व्यवहार मुझे लगता है कि कंसोल से पता चलता है: फ़ाइल stdout_redirect_log.txt समाप्त होता है
> stdout_test.py
Writing to STDOUT from python, before redirect
Writing to STDOUT from test DLL
जबकि युक्त
Writing to STDOUT from python, after redirect
दूसरे शब्दों में, sys.stdout की स्थापना DLL द्वारा उत्पन्न stdout उत्पादन रीडायरेक्ट करने में विफल। यह विंडोज में stdout पुनर्निर्देशन के लिए अंतर्निहित एपीआई की प्रकृति को देखते हुए unsurprising है। मुझे इस समस्या का सामना मूल/सी ++ स्तर पर हुआ है और किसी प्रक्रिया के भीतर से stdout को विश्वसनीय रूप से रीडायरेक्ट करने का कोई तरीका नहीं मिला है। इसे बाहरी रूप से किया जाना है।
यह वास्तव में बहुत कारण मैं एक बच्चे की प्रक्रिया शुरू करने रहा है - यह तो है कि मैं अपने पाइप को बाहर से कनेक्ट करने और इस प्रकार की गारंटी है कि मैं इसके उत्पादन के सभी अवरोध उत्पन्न कर रहा हूँ कर सकते हैं। मैं निश्चित रूप से pywin32 साथ मैन्युअल प्रक्रिया शुरू करके ऐसा कर सकते हैं, लेकिन मैं बहुत ज्यादा आदेश प्रगति प्राप्त करने के लिए, एक बहु पाइप वस्तु के माध्यम से बच्चे की प्रक्रिया के साथ संवाद करने की क्षमता विशेष रूप से, बहु की सुविधाओं का उपयोग करने में सक्षम होना चाहते हैं अद्यतन। सवाल अपने आईपीसी सुविधाओं और के लिए बहु मज़बूती से एक फाइल करने के लिए बच्चे की stdout और stderr उत्पादन के सभी पुनर्निर्देशित करने के लिए दोनों का उपयोग करने के लिए किसी भी तरह से है कि क्या वहाँ है।
अद्यतन: multiprocessing.Processs के लिए स्रोत कोड को देखते हुए, तो वह एक स्थिर सदस्य, _Popen, जो लगता है कि यह प्रक्रिया बनाने के लिए इस्तेमाल वर्ग ओवरराइड करने के लिए इस्तेमाल किया जा सकता है। यह कोई नहीं (डिफ़ॉल्ट) के लिए सेट है, तो यह एक multiprocessing.forking._Popen का उपयोग करता है, लेकिन यह कह
multiprocessing.Process._Popen = MyPopenClass
मैं इस प्रक्रिया निर्माण रद्द कर सकते थे द्वारा तरह दिखता है। हालांकि, हालांकि मैं multiprocessing.forking._Popen से निकाले जाते हैं सकता है, यह है कि मैं अपने कार्यान्वयन, जो परतदार और बहुत नहीं भविष्य प्रूफ लगता में आंतरिक सामान का एक समूह कॉपी करने के लिए होता लग रहा है। अगर यह एकमात्र विकल्प है, तो मुझे लगता है कि मैं शायद पूरी चीज को मैन्युअल रूप से pywin32 के साथ करने के लिए मोटा होगा।
आप उपप्रक्रिया लांच करने के लिए Win32 एपीआई का उपयोग कर सकते हैं, या यह मौजूदा पायथन पुस्तकालयों का उपयोग किया जा करने के लिए है? –
हां, मैंने इस सवाल में उल्लेख किया है कि "मैं निश्चित रूप से pywin32 के साथ प्रक्रिया को लॉन्च करके यह कर सकता हूं"। stdin/stdout बच्चे के लिए संभालती है निर्दिष्ट करने की क्षमता - यह सिर्फ उच्च स्तर, मंच स्वतंत्र बहु क्योंकि जो लापता कार्यशीलता का एक तुच्छ सा की तरह लगता है के मॉड्यूल का परित्याग करने के लिए एक शर्म की बात है लग रहा था। – Tom
दृष्टिकोण मैं ले रहा हूँ (जब तक किसी को एक बेहतर विकल्प के साथ आता है) stdin/stdout एक फ़ाइल पर पुनः निर्देशित साथ उपप्रक्रिया मॉड्यूल के माध्यम से प्रक्रिया शुरू करने के लिए,, और प्रगति संचार के लिए पाइप नाम के एक देशी Windows का उपयोग है। – Tom