আমি কীভাবে কোনও পাঠ্য ফাইলে একটি সাবপ্রসেস কল পাইপ করব?


96
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"])

রিগট এখন আমার একটি স্ক্রিপ্ট রয়েছে যা আমি চালাচ্ছি। আমি যখন এটি চালান এবং এটি এই লাইনটিকে হিট করে, এটি স্টাফ প্রিন্ট করা শুরু করে কারণ রান.শ এর এতে প্রিন্ট রয়েছে।

আমি কীভাবে এটি কোনও পাঠ্য ফাইলে পাইপ করব? (এবং সম্ভব হলে মুদ্রণ করুন)

উত্তর:


178

আপনি একটি ফাইল আউটপুট লিখতে চান আপনি ব্যবহার করতে পারেন stdout- এ এর -argument subprocess.call

এটি লাগে None, subprocess.PIPEকোনও ফাইল অবজেক্ট বা একটি ফাইল বর্ণনাকারী। প্রথমটি ডিফল্ট, stdout পিতামাতার (আপনার স্ক্রিপ্ট) থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়। দ্বিতীয়টি আপনাকে একটি কমান্ড / প্রক্রিয়া থেকে অন্য কমান্ডে পাইপ দেওয়ার অনুমতি দেয়। তৃতীয় এবং চতুর্থ হ'ল আপনি যা চান তা কোনও ফাইলে আউটপুট লেখা থাকে।

আপনাকে এই জাতীয় কিছু দিয়ে একটি ফাইল খুলতে openহবে এবং অবজেক্ট বা ফাইল বিবরণকারী পূর্ণসংখ্যা এখানে পাস করতে হবে call:

f = open("blah.txt", "w")
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=f)

আমি অনুমান করছি যে কোনও বৈধ ফাইলের মতো বস্তুটি সকেটের (হাসি :) এর মতো কাজ করবে, তবে আমি কখনও চেষ্টা করিনি।

মার্ক যেমন মন্তব্যগুলিতে উল্লেখ করেছেন যে আপনি স্ট্যাডারকেও পুনঃনির্দেশ করতে চাইতে পারেন, আপনি এটিকে স্টডআউটের মতো একই জায়গায় পুনর্নির্দেশ করতে পারেন stderr=subprocess.STDOUT। উপরে উল্লিখিত মানগুলির যে কোনও একটি পাশাপাশি কাজ করে, আপনি বিভিন্ন জায়গায় পুনর্নির্দেশ করতে পারেন।


6
সাবপ্রসেস.কল (["প্রতিধ্বনি", "1", ">>", "t.txt"]) কাজ করে না কেন?
স্ট্যাকওভারফ্লো অফিশিয়াল

7
@ গোল্ডনেম আপনার পুনঃনির্দেশ করার জন্য একটি শেল দরকার, সুতরাং: subprocess.call(["echo", "1", ">>", "t.txt"], shell=True)কাজ করা উচিত।
ওয়েজ মেসন

@ ওয়েসমাসন ধন্যবাদ, তবে আমি ভেবেছিলাম সাবপ্রসেসকস.ল এমনভাবে কাজ করেছে যা শেলটিতে মূলত অনুলিপি করা ও পেস্ট করার মতো ছিল?
স্ট্যাকওভারফ্লো অফিশিয়াল

4
@ গোল্ড নেম না, সাবপ্রসেসের সমস্ত কিছুই অন্তর্নিহিত পোপেন শ্রেণীর উপর নির্ভর করে যা একটি প্রক্রিয়া খোলে, শেল = ট্রু প্রসেসটি সিস্টেম ডিফল্ট শেলটিতে চালিত করতে বাধ্য করবে (যেমন / পিনসেক্স সিস্টেমে বিন / শ, যা সাধারণত বাশ বা ড্যাশ হয়) ), এটি শেল দ্বারা সরবরাহিত অতিরিক্ত ক্রিয়াকলাপের সমস্তটির জন্য খোলা না থাকায় এটি আরও নিরাপদ ( এছাড়াও কটাক্ষপাত করা shlex.quoteআপনি একটি subshell কোনো সম্ভবত মলিন তথ্য ক্ষণস্থায়ী হয় পারেন।
ওয়েস মেসন

4
আমাদের কাজ শেষ হওয়ার পরেও কি ফাইলটি বন্ধ করা উচিত? : এই ফাইলের বন্ধ হয়ে যাবে পর আমরা সম্পন্ন হয় with open("blah.txt","w") as f: subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) @Skurmedel
Alper

19

এর জন্য বিকল্পগুলি ব্যবহার করা popenযেতে পারেcall

args, 
bufsize=0, 
executable=None, 
stdin=None, 
stdout=None, 
stderr=None, 
preexec_fn=None, 
close_fds=False, 
shell=False, 
cwd=None, 
env=None, 
universal_newlines=False, 
startupinfo=None, 
creationflags=0

তাই ...

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=myoutput)

তারপরে আপনি myoutputযা চান তা করতে পারেন (যা একটি ফাইল বিটিডব্লু হওয়া দরকার)।

এছাড়াও, আপনি যেমন পাইপ আউটপুট কাছাকাছি কিছু করতে পারেন।

dmesg | grep hda

হবে:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

অজগর ম্যানুয়াল পৃষ্ঠায় প্রচুর মনোরম, দরকারী তথ্য রয়েছে ।


-2

আপনি যদি টার্মিনাল থেকে স্ক্রিপ্টটি কল করতে পারেন তবে সবকিছুতে একটি ফাইলের আউটপুট, যদি এটি সাহায্য করে। এই পথে:

$ /path/to/the/script.py > output.txt

এটি ফাইলটি ওভাররাইট করবে। আপনি >>এটি যুক্ত করতে ব্যবহার করতে পারেন ।

আপনি যদি ফাইলটিতে ত্রুটিগুলিও লগ ইন করতে চান তবে ব্যবহার করুন &>>বা &>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.