সাবপ্রসেস থেকে রিয়েলটাইমে স্ট্যাডআউট ধরা


89

আমি subprocess.Popen()উইন্ডোজে rsync.exe করতে চাই এবং পাইথনের স্টাডাউট প্রিন্ট করতে চাই।

আমার কোডটি কাজ করে, তবে কোনও ফাইল স্থানান্তর সম্পন্ন না হওয়া পর্যন্ত এটি অগ্রগতি অর্জন করে না! আমি প্রতিটি ফাইলের জন্য বাস্তব সময়ে প্রিন্ট করতে চাই।

পাইথন ৩.১ ব্যবহার করার পরে যেহেতু আমি শুনেছি এটি আইও পরিচালনা করার ক্ষেত্রে আরও ভাল হওয়া উচিত।

import subprocess, time, os, sys

cmd = "rsync.exe -vaz -P source/ dest/"
p, line = True, 'start'


p = subprocess.Popen(cmd,
                     shell=True,
                     bufsize=64,
                     stdin=subprocess.PIPE,
                     stderr=subprocess.PIPE,
                     stdout=subprocess.PIPE)

for line in p.stdout:
    print(">>> " + str(line.rstrip()))
    p.stdout.flush()


4
(গুগল থেকে আসছেন?) পিআইপিই'র কোনও একটি বাফার পূরণ না হয়ে পড়ার পরে সমস্ত পাইপগুলি অচল হয়ে যাবে। উদাহরণস্বরূপ stdrr পূরণ করা হয় যখন stdout অচল। আপনি যে পাইপটি চান না তা কখনই পাস করবেন না।
নাসের আল-ওহাইবি

কেউ কি ব্যাখ্যা করতে পারেন যে আপনি কেবল সাবপ্রসেসের পরিবর্তে sys.stdout এ স্টাডআউট সেট করতে পারেন নি? পিআইপিই?
মাইক

উত্তর:


101

এর জন্য থাম্বের কিছু নিয়ম subprocess

  • কখনও ব্যবহার করবেন না shell=True। এটি অযথা আপনার প্রোগ্রামকে কল করার জন্য একটি অতিরিক্ত শেল প্রক্রিয়া শুরু করে।
  • প্রক্রিয়া কল করার সময়, আর্গুমেন্টগুলি তালিকা হিসাবে পাস করা হয়। sys.argvপাইথন ইন একটি তালিকা, এবং argvসি তে হয়। সুতরাং আপনি একটি স্ট্রিং নয়, subprocesses কল করতে একটি তালিকা পাস Popen
  • পুনর্নির্দেশ না stderrএকটি থেকে PIPEযখন আপনি এটি পড়া করছি না।
  • আপনি stdinযখন এটি লিখছেন না তখন পুনর্নির্দেশ করবেন না ।

উদাহরণ:

import subprocess, time, os, sys
cmd = ["rsync.exe", "-vaz", "-P", "source/" ,"dest/"]

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

for line in iter(p.stdout.readline, b''):
    print(">>> " + line.rstrip())

এটি বলেছিল যে, এটি সম্ভবত টার্মিনালের পরিবর্তে পাইপের সাথে সংযুক্ত আছে কিনা তা সনাক্ত করে যখন আরএসসিএনসি তার আউটপুটটিকে বাফার করে। এটি ডিফল্ট আচরণ - যখন পাইপের সাথে সংযুক্ত থাকে, প্রোগ্রামগুলি অবশ্যই রিয়েলটাইমের ফলাফলের জন্য স্পষ্টভাবে স্ট্ডআউটকে ফ্লাশ করতে হবে, অন্যথায় স্ট্যান্ডার্ড সি লাইব্রেরিটি বাফার করবে।

এর জন্য পরীক্ষা করতে, পরিবর্তে এটি চালানোর চেষ্টা করুন:

cmd = [sys.executable, 'test_out.py']

এবং test_out.pyবিষয়বস্তু সহ একটি ফাইল তৈরি করুন:

import sys
import time
print ("Hello")
sys.stdout.flush()
time.sleep(10)
print ("World")

এই সাব-প্রসেসটি কার্যকর করা আপনাকে "হ্যালো" দেবে এবং "ওয়ার্ল্ড" দেওয়ার আগে 10 সেকেন্ড অপেক্ষা করবে। যদি উপরের অজগর কোডের সাথে এটি ঘটে এবং এর সাথে না হয় rsync, তার অর্থ হ'ল rsyncনিজেই আউটপুট বাফার করছে, সুতরাং আপনার ভাগ্য নেই।

একটি সমাধান হ'ল সরাসরি এর সাথে সংযোগ স্থাপন করা pty, এরকম কিছু ব্যবহার করে pexpect


12
shell=Falseসঠিক জিনিসটি যখন আপনি কমান্ড লাইনটি বিশেষত ব্যবহারকারীর প্রবেশ করা ডেটা থেকে তৈরি করেন। তবে তবুও shell=Trueকার্যকর যখন আপনি বিশ্বস্ত উত্স থেকে সম্পূর্ণ কমান্ড লাইন পাবেন (উদাহরণস্বরূপ স্ক্রিপ্টে হার্ডকোডযুক্ত)।
ডেনিস ওটকিডাচ

10
@ ডেনিস ওটকিডাচ: আমি মনে করি না যে এর ব্যবহারের পরোয়ানা রয়েছে shell=True। এটি সম্পর্কে চিন্তা করুন - আপনি কেবল কোনও স্ট্রিং বিভক্ত করার জন্য মেমরি বরাদ্দ, ডিস্কের ব্যবহার, প্রসেসরের সময়সূচী জড়িত আপনার ওএসে অন্য একটি প্রক্রিয়া শুরু করছেন ! এবং একজন আপনি নিজের সাথে যোগদান করেছেন !! আপনি পাইথনে বিভক্ত হয়ে যেতে পারেন, তবে প্রতিটি পরামিতি আলাদাভাবে লেখার চেয়ে আরও সহজ। এছাড়াও, একটি তালিকা মাধ্যম ব্যবহার আপনি বিশেষ শেল অক্ষর অব্যাহতি হবে না: স্পেস, ;, >, <, &.. তোমার পরামিতি ঐ অক্ষর ধারণ করতে পারে এবং আপনি চিন্তা করতে হবে না! আমি shell=Trueশেল-কমান্ড না চালিয়ে আসলেই ব্যবহার করার কারণ দেখতে পাচ্ছি না ।
nosklo

nosklo, এটি হওয়া উচিত: p = subprocess.Popen (cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
সেন্থিল কুমারান

4
@ ম্যাথটিক: আপনি কেন এই পৃথক প্রক্রিয়া হিসাবে অপারেশন করবেন তা আমি নিশ্চিত নই ... আপনি csvমডিউলটি ব্যবহার করে ফাইলের সামগ্রীগুলি কাটাতে এবং পাইথনটিতে সহজেই প্রথম ক্ষেত্রটি বের করতে পারেন । তবে উদাহরণ হিসাবে, অজগরটিতে আপনার পাইপলাইনটি হ'ল: p = Popen(['cut', '-f1'], stdin=open('longfile.tab'), stdout=PIPE) ; p2 = Popen(['head', '-100'], stdin=p.stdout, stdout=PIPE) ; result, stderr = p2.communicate() ; print resultদ্রষ্টব্য যে আপনি দীর্ঘ ফাইলের নাম এবং শেল বিশেষ অক্ষরগুলির সাথে পালাতে না পেরে কাজ করতে পারবেন, এখন যে শেলটি এতে জড়িত নেই। আরও একটি প্রক্রিয়া যেহেতু এটি অনেক দ্রুত।
নসক্লো

11
পাইথন 2 এর for line in iter(p.stdout.readline, b'')পরিবর্তে ব্যবহার করুন for line in p.stdoutঅন্যথায় উত্স প্রক্রিয়া যদি আউটপুটটি বাফার না করে তবে লাইনে রিয়েল টাইমে পড়েনা।
jfs

43

আমি জানি এটি একটি পুরানো বিষয়, তবে এখন একটি সমাধান রয়েছে। বিকল্পটি --outbuf = এল সহ আরএসসিএনকে কল করুন। উদাহরণ:

cmd=['rsync', '-arzv','--backup','--outbuf=L','source/','dest']
p = subprocess.Popen(cmd,
                     stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, b''):
    print '>>> {}'.format(line.rstrip())

4
এটি কাজ করে এবং উপরের সমস্ত ডায়ালগটির মধ্য দিয়ে ভবিষ্যতের পাঠকদেরকে স্ক্রোলিং থেকে বাঁচাতে আপগ্রেটেড করা উচিত।
ভেক্টরভিক্টর

4
@ ভেক্টরভিক্টর এটি কী চলছে এবং কেন চলছে তা ব্যাখ্যা করে না। এটি হতে পারে যে আপনার প্রোগ্রামটি চলবে: অবধি: ১. আপনি preexec_fn=os.setpgrpপ্রোগ্রামটিকে তার মূল স্ক্রিপ্টটি টিকিয়ে রাখতে যোগ করেন ২. আপনি প্রক্রিয়াটির পাইপ থেকে পড়া ছেড়ে যান the. প্রক্রিয়াটি পাইপটি পূরণ করে প্রচুর ডেটা আউটপুট দেয় you. আপনি ঘন্টাখানেক আটকে আছেন , আপনি যে প্রোগ্রামটি চালাচ্ছেন তা কেন কিছুটা এলোমেলো সময়ের পরে ছাড়ার চেষ্টা করছে । @ ননস্ক্লো থেকে প্রাপ্ত উত্তর আমাকে অনেক সাহায্য করেছে।
ডানুকার

16

লিনাক্সে, আমার বাফারিং থেকে মুক্তি পাওয়ার একই সমস্যা ছিল। পিআইপিই বাফারিং থেকে মুক্তি পেতে অবশেষে আমি "stdbuf -o0" (বা প্রত্যাশা থেকে উদ্বিগ্ন) ব্যবহার করেছি।

proc = Popen(['stdbuf', '-o0'] + cmd, stdout=PIPE, stderr=PIPE)
stdout = proc.stdout

আমি তখন stdout এ সিলেক্ট সিলেক্ট করতে পারি।

এছাড়াও দেখুন /unix/25372/


4
পাইথন থেকে যে কেউ সি কোড স্টাডাউট দখল করার চেষ্টা করছেন, আমি নিশ্চিত করতে পারি যে এই সমাধানটিই আমার পক্ষে কাজ করেছিল। পরিষ্কার করে বলতে গেলে, আমি পপেনের আমার বিদ্যমান কমান্ড তালিকায় 'stdbuf', '-o0' যুক্ত করার কথা বলছি।
বেপরোয়া

ধন্যবাদ! একগুচ্ছ পাইয়েস্ট / পাইস্টেস্ট-বিডিডি পরীক্ষার সাথে সত্যই দরকারী stdbuf -o0বলে প্রমাণিত হয়েছিল যে আমি লিখেছিলাম যে একটি সি ++ অ্যাপ্লিকেশন হয়েছে এবং তা যাচাই করেছে যে এটি নির্দিষ্ট লগের বিবৃতি প্রকাশ করে। ছাড়া , এই পরীক্ষাগুলি সি ++ প্রোগ্রাম থেকে আউটপুট (বাফার) পেতে 7 সেকেন্ডের প্রয়োজন। এখন তারা প্রায় তাত্ক্ষণিকভাবে চালায়! stdbuf -o0
এএফিডেফ্লো

এই উত্তরটি আজ আমাকে বাঁচায়! এর অংশ হিসাবে সাবপ্রসেসিস হিসাবে অ্যাপ্লিকেশন চালানো pytest, এটির আউটপুট পাওয়া আমার পক্ষে অসম্ভব ছিল। stdbufএটা কি পারে.
জানোস

14

ব্যবহারের ক্ষেত্রে উপর নির্ভর করে আপনি সাব-প্রসেসে নিজেই বাফারিংটি অক্ষম করতে চাইতে পারেন।

যদি সাবপ্রসেসটি পাইথন প্রক্রিয়া হয়, আপনি কল করার আগে এটি করতে পারেন:

os.environ["PYTHONUNBUFFERED"] = "1"

অথবা বিকল্পভাবে envযুক্তিতে এটি পাস করুন Popen

অন্যথায়, আপনি যদি লিনাক্স / ইউনিক্সে থাকেন তবে আপনি stdbufসরঞ্জামটি ব্যবহার করতে পারেন । যেমন:

cmd = ["stdbuf", "-oL"] + cmd

আরও দেখুন এখানে সম্পর্কে stdbufবা অন্যান্য অপশন।


4
আপনি আমার দিনটি বাঁচান, পাইথুনবুফফেরড = 1 এর জন্য ধন্যবাদ
দ্যল্যান্ডল্যান্ড

9
for line in p.stdout:
  ...

সর্বদা পরবর্তী লাইন-ফিড পর্যন্ত অবরুদ্ধ করে।

"রিয়েল-টাইম" আচরণের জন্য আপনাকে এই জাতীয় কিছু করতে হবে:

while True:
  inchar = p.stdout.read(1)
  if inchar: #neither empty string nor None
    print(str(inchar), end='') #or end=None to flush immediately
  else:
    print('') #flush for implicit line-buffering
    break

যখন শিশু প্রক্রিয়াটি তার স্টাডআউটটি বন্ধ করে দেয় বা প্রস্থান হয় তখন লুপটি বাকি থাকে। read()/read(-1)শিশু প্রক্রিয়াটি তার স্টাডআউট বন্ধ বা প্রস্থান না হওয়া অবধি অবরুদ্ধ হবে।


4
incharপরিবর্তে কখনও Noneব্যবহার if not inchar:করা হয় না ( read()EOF এ খালি স্ট্রিং ফেরত) returns বিটিডব্লিউ, এটির চেয়েও খারাপ এটি for line in p.stdoutপাইথন 2 এ রিয়েলটাইম এমনকি পুরো লাইনগুলিও মুদ্রণ করে না for line in (এর পরিবর্তে (p.stdout.readline, '') used পরিবর্তে ব্যবহার করা যেতে পারে)।
jfs

4
আমি এটি অক্সে অজগর 3.4 দিয়ে পরীক্ষা করেছি এবং এটি কার্যকর হয় না।
কিড

4
@ কেয়েড: for line in p.stdout:পাইথন ৩ এ কাজ করে 3. ''(ইউনিকোড স্ট্রিং) এবং b''(বাইটস) মধ্যে পার্থক্য বুঝতে ভুলবেন না । পাইথন
জেএফএস

8

আপনার সমস্যাটি হ'ল:

for line in p.stdout:
    print(">>> " + str(line.rstrip()))
    p.stdout.flush()

পুনরুক্তিকারী নিজেই অতিরিক্ত বাফারিং আছে।

এটি করার চেষ্টা করুন:

while True:
  line = p.stdout.readline()
  if not line:
     break
  print line

5

আপনি পাইপে আনফারড মুদ্রণের জন্য স্টাডাউট পেতে পারবেন না (যদি আপনি প্রোগ্রামটি নতুন করে লিখতে না পারেন তবে স্টাডাউট প্রিন্ট করে), তাই আমার সমাধানটি এখানে:

স্টার্ডআউটকে স্টেরারে পুনর্নির্দেশ করুন, যা বাফার হয় না। '<cmd> 1>&2'এটা করা উচিত। প্রক্রিয়াটি নিম্নরূপে খুলুন: myproc = subprocess.Popen('<cmd> 1>&2', stderr=subprocess.PIPE)
আপনি স্টডআউট বা স্ট্ডার থেকে আলাদা করতে পারবেন না, তবে আপনি সমস্ত আউটপুট সঙ্গে সঙ্গেই পাবেন get

আশা করি যে কেউ এই সমস্যা মোকাবেলায় সহায়তা করবে।


4
আপনি কি এটা চেষ্টা করেছেন? কারণ এটি কাজ করে না .. স্টাডাউটটি যদি সেই প্রক্রিয়াতে বাফার করা হয় তবে এটি স্টাইডারে একইভাবে পুনর্নির্দেশ করা হবে না এটি কোনও পাইপ বা ফাইলে পুনর্নির্দেশ করা হয়নি ..
ফিলিপ পাইনা

4
এটি সাধারণ ভুল। স্টাডাউট বাফারিং প্রোগ্রামের মধ্যেই ঘটে। 1>&2প্রোগ্রামটি চালু করার আগে ফাইল-বর্ণনাকারী ফাইলগুলি ফাইল করে এমন ফাইলগুলির শেল সিনট্যাক্সটি কেবলমাত্র পরিবর্তন করে। প্রোগ্রামটি নিজেই স্টডআউটকে স্টার্ডার ( 1>&2) বা তদ্বিপরীত ( 2>&1) এর মধ্যে পুনঃনির্দেশ করার মধ্যে পার্থক্য করতে পারে না তাই প্রোগ্রামের বাফারিং আচরণে এটির কোনও প্রভাব পড়বে না nd এবং উভয় উপায়ে 1>&2শেল দ্বারা সিনট্যাক্সের ব্যাখ্যা দেওয়া হয়। subprocess.Popen('<cmd> 1>&2', stderr=subprocess.PIPE)ব্যর্থ হবে কারণ আপনি নির্দিষ্ট করেন নি shell=True
ম্যানলে

লোকেরা এটি পড়তে পারে: আমি স্টাডাউটের পরিবর্তে স্ট্যাডার ব্যবহার করার চেষ্টা করেছি, এটি ঠিক একই আচরণ দেখায়।
martinthenext

3

স্ট্রেডআউটটি আরএসসিএনসি প্রক্রিয়া থেকে আনফার করাতে পরিবর্তন করুন।

p = subprocess.Popen(cmd,
                     shell=True,
                     bufsize=0,  # 0=unbuffered, 1=line-buffered, else buffer-size
                     stdin=subprocess.PIPE,
                     stderr=subprocess.PIPE,
                     stdout=subprocess.PIPE)

4
বাফারিংটি আরএসআইএনসি সাইডে ঘটে, পাইথন সাইডে বুফসাইজ অ্যাট্রিবিউট পরিবর্তন করলে কোনও লাভ হবে না।
nosklo

14
অন্য যে কেউ অনুসন্ধান করছে, নসক্লো এর উত্তর সম্পূর্ণ ভুল: আরএসসিএনসি এর অগ্রগতি প্রদর্শন বাফার হয় না; আসল সমস্যাটি হ'ল সাবপ্রসেসটি কোনও ফাইল অবজেক্ট ফিরিয়ে দেয় এবং ফাইল পুনরাবৃত্তকারী ইন্টারফেসে বাফসাইজ = 0 থাকা সত্ত্বেও দুর্বল নথিভুক্ত অভ্যন্তরীণ বাফার রয়েছে, আপনাকে বাফার পূরণের আগে ফলাফলের প্রয়োজন হলে বার বার রিডলাইন () কল করতে হবে।
ক্রিস অ্যাডামস

3

আউটপুট ক্যাচিং এড়ানোর জন্য আপনি সম্ভবত এক্সপেক্টটি চেষ্টা করতে চান,

child = pexpect.spawn(launchcmd,args,timeout=None)
while True:
    try:
        child.expect('\n')
        print(child.before)
    except pexpect.EOF:
        break

পিএস : আমি জানি এই প্রশ্নটি বেশ পুরানো, এখনও আমার জন্য কার্যকর সমাধানটি সরবরাহ করে।

পিপিএস : অন্য একটি প্রশ্ন থেকে এই উত্তর পেয়েছে


3
    p = subprocess.Popen(command,
                                bufsize=0,
                                universal_newlines=True)

আমি পাইথনে আরএসএনসি-র জন্য একটি জিইউআই লিখছি, এবং একই প্রবাদ রয়েছে। পাইডকটিতে এটি না পাওয়া পর্যন্ত এই সমস্যাটি বেশ কয়েক দিন ধরে আমাকে সমস্যায় ফেলেছে।

ইউনিভার্সাল_নিউলাইনস যদি সত্য হয় তবে সর্বজনীন নিউলাইনস মোডে টেক্সট ফাইল হিসাবে স্ট্যান্ডআউট এবং স্টডার ফাইল অবজেক্টগুলি খোলা হবে। উইন্ডোজ কনভেনশন, লাইনগুলি ইউনিক্সের শেষ-অব-লাইন কনভেনশন, '\ r', পুরানো ম্যাকিনটোস কনভেনশন বা '\ r \ n' দ্বারা শেষ হতে পারে। এই সমস্ত বাহ্যিক উপস্থাপনা পাইথন প্রোগ্রাম দ্বারা '\ n' হিসাবে দেখা হয়।

দেখে মনে হচ্ছে যে অনুবাদ চলছে যখন আরএসআইএনসি '\ r' আউটপুট দেবে।


1

আমি লক্ষ করেছি যে অস্থায়ী ফাইলটি মধ্যবর্তী হিসাবে ব্যবহারের কোনও উল্লেখ নেই। নীচে অস্থায়ী ফাইলে আউটপুট করে বাফারিংয়ের সমস্যাগুলি পাওয়া যায় এবং আপনাকে পিটিআইয়ের সাথে সংযুক্ত না করে আরএসসিএনসি থেকে আসা ডেটা পার্স করার অনুমতি দেয়। আমি নিম্নলিখিতটি একটি লিনাক্স বাক্সে পরীক্ষা করেছি এবং আরএসসিএনসি-র আউটপুট প্ল্যাটফর্মগুলিতে পৃথক হতে পারে, তাই আউটপুট পার্স করার নিয়মিত প্রকাশগুলি বিভিন্ন রকম হতে পারে:

import subprocess, time, tempfile, re

pipe_output, file_name = tempfile.TemporaryFile()
cmd = ["rsync", "-vaz", "-P", "/src/" ,"/dest"]

p = subprocess.Popen(cmd, stdout=pipe_output, 
                     stderr=subprocess.STDOUT)
while p.poll() is None:
    # p.poll() returns None while the program is still running
    # sleep for 1 second
    time.sleep(1)
    last_line =  open(file_name).readlines()
    # it's possible that it hasn't output yet, so continue
    if len(last_line) == 0: continue
    last_line = last_line[-1]
    # Matching to "[bytes downloaded]  number%  [speed] number:number:number"
    match_it = re.match(".* ([0-9]*)%.* ([0-9]*:[0-9]*:[0-9]*).*", last_line)
    if not match_it: continue
    # in this case, the percentage is stored in match_it.group(1), 
    # time in match_it.group(2).  We could do something with it here...

এটা বাস্তব সময়ে হয় না। একটি ফাইল আরএসআইএনসি এর পক্ষ থেকে বাফারিংয়ের সমস্যা সমাধান করে না।
jfs

অস্থিরতা। টেম্পোরারিফায়াল ব্যতিক্রমগুলির ক্ষেত্রে সহজে পরিষ্কার করার জন্য নিজেকে মুছতে পারে
jfs

4
while not p.poll()অসম্পূর্ণ লুপ বাড়ে যদি সাবপ্রসেস 0 সাফল্যের সাথে প্রস্থান করে, p.poll() is Noneপরিবর্তে ব্যবহার করুন
jfs

উইন্ডোজ ইতিমধ্যে খোলা ফাইলটি খুলতে নিষেধ করতে পারে, তাই open(file_name)ব্যর্থ হতে পারে
jfs

4
আমি এই উত্তরটি পেয়েছি, দুর্ভাগ্যবশত কেবল লিনাক্সের জন্য, তবে একটি আকর্ষণীয় লিঙ্কের মতো কাজ করে তাই আমি কেবল আমার আদেশটি নীচের মতো প্রসারিত করেছি: command_argv = ["stdbuf","-i0","-o0","-e0"] + command_argvএবং কল করুন: popen = subprocess.Popen(cmd, stdout=subprocess.PIPE) এবং এখন আমি কোনও বাফারিং ছাড়াই পড়তে পারি
অরভিদ তেরজিবাসাচিয়ান

0

আপনি যদি থ্রেডে এই জাতীয় কিছু চালান এবং কোনও পদ্ধতির কোনও সম্পত্তিতে ffmpeg_time সম্পত্তি সংরক্ষণ করেন তবে আপনি এটি অ্যাক্সেস করতে পারেন এটি খুব সুন্দর কাজ করবে আমি এই জাতীয় ফলাফলগুলি পাই: আপনি যদি টিন্টারে থ্রেডিং ব্যবহার করেন তবে আউটপুট এমন হবে

input = 'path/input_file.mp4'
output = 'path/input_file.mp4'
command = "ffmpeg -y -v quiet -stats -i \"" + str(input) + "\" -metadata title=\"@alaa_sanatisharif\" -preset ultrafast -vcodec copy -r 50 -vsync 1 -async 1 \"" + output + "\""
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, shell=True)
for line in self.process.stdout:
    reg = re.search('\d\d:\d\d:\d\d', line)
    ffmpeg_time = reg.group(0) if reg else ''
    print(ffmpeg_time)

-1

পাইথন 3-তে, এখানে একটি সমাধান রয়েছে, যা কমান্ড লাইন থেকে একটি কমান্ড নেয় এবং রিয়েল-টাইমটি সুন্দরভাবে ডিকোডেড স্ট্রিংগুলি সরবরাহ করার সাথে সাথে প্রদান করে।

রিসিভার ( receiver.py):

import subprocess
import sys

cmd = sys.argv[1:]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in p.stdout:
    print("received: {}".format(line.rstrip().decode("utf-8")))

রিয়েল-টাইম আউটপুট উত্পন্ন করতে পারে এমন সহজ প্রোগ্রামের উদাহরণ ( dummy_out.py):

import time
import sys

for i in range(5):
    print("hello {}".format(i))
    sys.stdout.flush()  
    time.sleep(1)

আউটপুট:

$python receiver.py python dummy_out.py
received: hello 0
received: hello 1
received: hello 2
received: hello 3
received: hello 4
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.