मुझे आश्चर्य है कि एक अलग थ्रेड में एक उपप्रोसेस शुरू होने पर संचार पाइप को बंद करना संभव है। अगर मैं संवाद() को कॉल नहीं करता हूं तो मार डालें() उम्मीद के अनुसार काम करेगा, प्रक्रिया को पांच की बजाय एक सेकंड के बाद समाप्त कर देगा।पायथन उपप्रोसेन पॉपन के साथ शुरू की गई प्रक्रिया को मारते समय मैं स्टडआउट-पाइप को कैसे बंद करूं?
मुझे इसी तरह की समस्या here की चर्चा मिली, लेकिन मुझे कोई वास्तविक जवाब नहीं मिला। मुझे लगता है कि मुझे या तो पाइप को बंद करने या उप-उपप्रकार (जिसे उदाहरण में "नींद" है) को स्पष्ट रूप से मारने में सक्षम होना चाहिए और पाइप को अनवरोधित करने के लिए उसे मारना है।
मैं भी इतने पर जवाब उसे ढूँढने की कोशिश की, लेकिन मैं केवल this और this और this, जो सीधे जहाँ तक मैं बता सकता है इस समस्या का समाधान नहीं करते हैं (?)।
तो मैं जो चीज करना चाहता हूं वह दूसरे थ्रेड में कमांड चलाने में सक्षम होना है और इसके सभी आउटपुट प्राप्त करना है, लेकिन जब मैं चाहूं तो इसे तुरंत मारने में सक्षम हूं। मैं एक फ़ाइल और पूंछ के माध्यम से या इसी तरह के माध्यम से जा सकता था, लेकिन मुझे लगता है कि ऐसा करने के लिए एक बेहतर तरीका होना चाहिए?
import subprocess, time
from threading import Thread
process = None
def executeCommand(command, runCommand):
Thread(target=runCommand, args=(command,)).start()
def runCommand(command):
global process
args = command.strip().split()
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)
for line in process.communicate():
if line:
print "process:", line,
if __name__ == '__main__':
executeCommand("./ascript.sh", runCommand)
time.sleep(1)
process.kill()
यह स्क्रिप्ट है:
#!/bin/bash
echo "sleeping five"
sleep 5
echo "slept five"
आउटपुट
$ time python poc.py
process: sleeping five
real 0m5.053s
user 0m0.044s
sys 0m0.000s
जब 'process.kill()' कहा जाता है, '।/ascript.sh' मर जाता है लेकिन' नींद 5' इसके अंदर नहीं करता है। दिलचस्प है, हालांकि, पाइथन तुरंत '/ ascript.sh' मरने के बाद वापस नहीं आता है। –