এর জন্য থাম্বের কিছু নিয়ম 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
।