পাইথন সাবপ্রসেস যোগাযোগের পদ্ধতি ব্যবহার করার সময় কীভাবে প্রস্থান কোড পাবেন?


185

পাইথনের subprocessমডিউল এবং communicate()পদ্ধতিটি ব্যবহার করার সময় আমি কীভাবে প্রস্থান কোডটি পুনরুদ্ধার করব ?

প্রাসঙ্গিক কোড:

import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]

আমার কি অন্যভাবে করা উচিত?

উত্তর:


264

Popen.communicatereturncodeএটি (*) হয়ে গেলে অ্যাট্রিবিউট সেট করবে । এখানে সম্পর্কিত ডকুমেন্টেশন বিভাগ:

Popen.returncode 
  The child return code, set by poll() and wait() (and indirectly by communicate()). 
  A None value indicates that the process hasnt terminated yet.

  A negative value -N indicates that the child was terminated by signal N (Unix only).

সুতরাং আপনি ঠিক করতে পারেন (আমি এটি পরীক্ষা করি নি তবে এটি কাজ করা উচিত):

import subprocess as sp
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
streamdata = child.communicate()[0]
rc = child.returncode

(*) এটি বাস্তবায়িত হওয়ার কারণে ঘটে: সন্তানের স্রোতগুলি পড়তে থ্রেড স্থাপন করার পরে, এটি কেবল কল করে wait


33
এই উদাহরণটি আমাকে সহায়তা করেছিল, তবে উদাহরণগুলি অস্পষ্ট সংক্ষিপ্তকরণ হিসাবে মানক কিছু আমদানির প্যাটার্নটি "এসপি হিসাবে আমদানি সাবপ্রসেসি" না করে তবে ভাল লাগবে। এই কোডটি অনুসরণ করে এমন 8 টি অক্ষর ছাঁটাইয়ের সময় এটি বুঝতে এবং পুনরায় ব্যবহার করাও অসুবিধাজনক হয়।
uglycoyote

16
@uglycoyote এর কোনও নিয়ম নেই যা বলে যে আপনাকে কপি এবং পেস্ট করতে হবে। আপনি চাইলে এটি কেবল টাইপ করুন, এটি লাইনের মতো 4 টির মতো।
জেসন সি

5
@uglycoyote আপনিও এটিকে এমন কিছু হিসাবে সম্পাদনা করতে পারেন from subprocess import Popenএবং তার Popenপরিবর্তে কেবল ব্যবহার করুন subprocess(or sp).Popenযা আমি বলব সম্ভবত পঠনযোগ্যতা বৃদ্ধি করবে এবং লাইনগুলি সংক্ষিপ্ত করে দেবে
মিচ

2
হ্যাঁ ... অবশ্যই কল করুন process.communicate()এবং তারপরে returncodeকিছু ভেরিয়েবলকে বরাদ্দ করুন । যদি অ্যাসাইনমেন্ট কল করার আগে করা হয় communicate, হয় None
ওয়েস্টার্নগুন

1
পাইপ পুনর্নির্দেশ না করে কি রিটার্ন কোডটি দেখানো সম্ভব? আমি বাশ কোডটি কল করছি এবং আমি টার্মিনালে রিয়েল টাইমে আউটপুটটি দেখতে চাই
নিসবা

9

আপনার প্রথমে নিশ্চিত হওয়া উচিত যে প্রক্রিয়াটি চলমান শেষ হয়েছে এবং .waitপদ্ধতিটি ব্যবহার করে রিটার্ন কোডটি পাঠ করা হয়েছে । এটি কোডটি ফিরিয়ে দেবে। আপনি পরে এটিতে অ্যাক্সেস চান, এটা যেমন সঞ্চিত .returncodeমধ্যে Popenঅবজেক্ট।


24
.communicate()ইতিমধ্যে সাবপ্রসেসটি সমাপ্ত হওয়ার জন্য অপেক্ষা করছে।
যান্ত্রিক শামুক

8

.poll() রিটার্ন কোড আপডেট করবে।

চেষ্টা

child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()

উপরন্তু, পরে .poll()বলা হয় রিটার্ন কোড হিসাবে অবজেক্ট হিসাবে উপলব্ধ child.returncode


যখন আমি এটি করেছি। পল () খালি ছিল। এটি কাজ করার জন্য আমাকে চাইল্ড.পল () এর উপরের লাইনে চাইল্ড ডটকমুনিট () চালাতে হয়েছিল।
NateW

1
আমি মনে করি আপনি ডকুমেন্টেশন অনুসারে .poll () এর পরিবর্তে .Wit () ব্যবহার করতে চেয়েছিলেন: ডকস.পিথথন.আর / 3 / লিবারি / সাউবপ্রসেসHtml । লক্ষ্য করুন যে .wait () একটি optionচ্ছিক সময়সীমা পরম নেয় যা সুবিধাজনক হতে পারে।
gg99

7

exitcode = data.wait()। সন্তানের প্রক্রিয়াটি অবরুদ্ধ করা হবে যদি এটি স্ট্যান্ডার্ড আউটপুট / ত্রুটি এবং / অথবা স্ট্যান্ডার্ড ইনপুট থেকে পড়ে এবং কোনও সমমনা থাকে are


1

এটি আমার পক্ষে কাজ করেছে। এটি শিশু প্রক্রিয়া দ্বারা আউটপুট প্রিন্ট করে

child = subprocess.Popen(serial_script_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    retValRunJobsSerialScript = 0
    for line in child.stdout.readlines():
        child.wait()
        print line           
    retValRunJobsSerialScript= child.returncode
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.