python - book - সহজ ভাষায় পাইথন ৩ pdf




শেল=সত্যের সাথে প্রবর্তিত একটি পাইথন সাবপ্রোসেসটি কিভাবে শেষ করবেন (7)

আমি নিম্নোক্ত কমান্ডটি দিয়ে একটি উপ-প্রসেস চালু করছি:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)

যাইহোক, যখন আমি ব্যবহার করে হত্যা করার চেষ্টা করি:

p.terminate()

অথবা

p.kill()

কমান্ড ব্যাকগ্রাউন্ডে চলতে থাকে, তাই আমি অবাক হয়ে ভাবছিলাম কিভাবে আমি আসলে প্রক্রিয়াটি বন্ধ করতে পারি।

মনে রাখবেন যে যখন আমি কমান্ড চালাচ্ছি:

p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)

এটি p.terminate() প্রদান করার সময় সফলভাবে সমাপ্ত হয়।


আপনি psutil ব্যবহার করতে পারেন, তাহলে এই পুরোপুরি কাজ করে:

import subprocess

import psutil


def kill(proc_pid):
    process = psutil.Process(proc_pid)
    for proc in process.children(recursive=True):
        proc.kill()
    process.kill()


proc = subprocess.Popen(["infinite_app", "param"], shell=True)
try:
    proc.wait(timeout=3)
except subprocess.TimeoutExpired:
    kill(proc.pid)

আমি এটা ব্যবহার করতে পারে

from subprocess import Popen

process = Popen(command, shell=True)
Popen("TASKKILL /F /PID {pid} /T".format(pid=process.pid))

এটি cmd.exe এবং প্রোগ্রাম যে আমি কমান্ড দিয়েছেন হত্যা।

(উইন্ডোজ)


আমি জানি এটি একটি পুরাতন প্রশ্ন কিন্তু এটি অন্য কোন পদ্ধতির জন্য অনুসন্ধান করতে পারে। আমি যা আহ্বান করেছি সেগুলি মেরে উইন্ডোতে ব্যবহার করি।

si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.call(["taskkill", "/IM", "robocopy.exe", "/T", "/F"], startupinfo=si)

/ আইএম ইমেজ নাম, যদি আপনি চান / পিআইডি করতে পারেন। / টি প্রক্রিয়া পাশাপাশি শিশু প্রসেস হত্যা। / এফ বল এটি terminates। সি, আমি এটা সেট আছে, আপনি একটি সিএমডি উইন্ডো দেখানো ছাড়া এটি কিভাবে। এই কোড পাইথন 3 ব্যবহার করা হয়।


এই উত্তরগুলির মধ্যে কেউ আমার জন্য কাজ করেনি তাই আমি কাজ করে কোডটি রেখে যাচ্ছি। আমার ক্ষেত্রেও .kill() সহ প্রক্রিয়াটি হত্যাকাণ্ডের পরেও এবং .poll() রিটার্ন কোড পেয়ে যাওয়ার প্রক্রিয়াটির অবসান ঘটেনি।

subprocess.Popen documentation নিম্নলিখিত:

"... সঠিকভাবে পরিচ্ছন্ন আচরণ করার জন্য অ্যাপ্লিকেশনটি শিশু প্রক্রিয়াটি বন্ধ করে যোগাযোগ শেষ করতে হবে ..."

proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

আমার ক্ষেত্রে proc.communicate() কল করার পরে proc.kill() । এটি stdin প্রক্রিয়া, stdout ... এবং প্রক্রিয়াটি শেষ করে।


দলের সব প্রসেস সংকেত পাঠান

    self.proc = Popen(commands, 
            stdout=PIPE, 
            stderr=STDOUT, 
            universal_newlines=True, 
            preexec_fn=os.setsid)

    os.killpg(os.getpgid(self.proc.pid), signal.SIGHUP)
    os.killpg(os.getpgid(self.proc.pid), signal.SIGTERM)

যেমন শাই বলেছিলেন, শেলটি শিশু, তাই সংকেতগুলি দ্বারা এটি আটকে যায় - শেল = মিথ্যা ব্যবহার করার জন্য সর্বোত্তম উপায় এবং কমান্ড লাইনটি বিভক্ত করার জন্য শ্লেক্স ব্যবহার করুন:

if isinstance(command, unicode):
    cmd = command.encode('utf8')
args = shlex.split(cmd)

p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

তারপর p.kill () এবং p.terminate () কীভাবে আপনি আশা করেন তা কাজ করতে হবে।


p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
p.kill()

p.kill() শেল প্রক্রিয়াটি শেষ করে শেষ করে এবং cmd এখনও চলমান হয়।

আমি এই দ্বারা একটি সুবিধাজনক ফিক্স পাওয়া:

p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)

এটি শেল প্রক্রিয়াকে শেল প্রসেসের উত্তরাধিকারী করে তুলবে, শেল চালু হওয়ার পরিবর্তে শিশু প্রক্রিয়াটি, যা মারা যায় না। p.pid আপনার p.pid প্রক্রিয়ার আইডি হবে।

p.kill() কাজ করা উচিত।

আমি জানি না এই পাইপের উপর কী প্রভাব পড়বে।





kill-process