উত্তর:
@ মিলনের উত্তর কাজ করে subprocess.call()
তবে আপনাকে খুব কম প্রতিক্রিয়া জানায়।
আমি ব্যবহার করতে পছন্দ করি subprocess.check_output()
যাতে আপনি স্টাডাউটে কী ছাপা হয়েছিল তা বিশ্লেষণ করতে পারেন:
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
আমন্ত্রিত কমান্ডের অন-শূন্য প্রস্থান করার সময় একটি ত্রুটি ছুড়ে দেয়
দয়া করে মনে রাখবেন যে bash
আপনি যদি ফাংশনটিতে মূল shell
শব্দটি যুক্তিটি নির্দিষ্ট না করেন তবে এটি অন্য কোনও শেল ডাকে না (এটি একই ক্ষেত্রে সত্য subprocess.call()
, এবং এটি সুরক্ষার ঝুঁকি চাপিয়ে দেওয়ার মতো যদি প্রয়োজন হয় না তবে) এটি সরাসরি অনুরোধ করে কমান্ড।
আপনি যদি পাইথন থেকে নিজেকে অনেকগুলি (বিভিন্ন) কমান্ডের আহ্বান করতে দেখেন তবে আপনি প্লাম্বামটি দেখতে চাইতে পারেন । এটির সাহায্যে আপনি আরও পাঠযোগ্য (আইএমও) করতে পারেন:
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
বা os.system
), উদা: res = os.popen('sudo apt update').read()
? @Anthon
subprocess
যদিও তৈরি করার যুক্তিটি ব্যাখ্যা করে os.system
এবং os.popen
ইতিমধ্যে বিদ্যমান ছিল। এই জাতীয় পিইপি গ্রহণযোগ্য হওয়ার জন্য অ-তুচ্ছ হয়। আপনার বা আমি কখনও যা করব তার চেয়ে বেশিরভাগ লোক এ বিষয়ে অনেক বেশি চিন্তাভাবনা করেছে। এবং subprocess
২০০৩ সাল থেকে উন্নতি হয়েছে, অন্যরা এখনও পিছিয়ে সামঞ্জস্যের জন্য রয়েছে। আপনি কি os.system
ম্যানুয়াল পৃষ্ঠাটি লাল করেছেন : সাবপ্রসেস মডিউলটি নতুন প্রক্রিয়া তৈরির এবং তাদের ফলাফল পুনরুদ্ধারের জন্য আরও শক্তিশালী সুবিধা সরবরাহ করে; এই ফাংশনটি ব্যবহার করার জন্য সেই মডিউলটি ব্যবহার করা ভাল।
sudo
শুধুমাত্র আরও তীব্র করতে চলেছে। হতে পারে পাইথন-এপটি ব্যবহার করা আরও ভাল সমাধান (আমি নিজে এটি দেখিনি)।
Subprocess মডিউল এই কাজ করতে ডিজাইন করা হয়েছে:
import subprocess
subprocess.call(["sudo", "apt", "update"])
কমান্ডটি ব্যর্থ হলে আপনি যদি স্ক্রিপ্টটি বন্ধ করতে চান, আপনি check_call()
নিজেরাই রিটার্ন কোডটি বিশ্লেষণের পরিবর্তে ব্যবহারের কথা বিবেচনা করতে পারেন:
subprocess.check_call(["sudo", "apt", "update"])
Traceback (most recent call last): File "/home/Dremor/test.py", line 3, in <module> subprocess.call('sudo', 'yum', 'update') File "/usr/lib64/python3.4/subprocess.py", line 537, in call with Popen(*popenargs, **kwargs) as p: File "/usr/lib64/python3.4/subprocess.py", line 767, in __init__ raise TypeError("bufsize must be an integer") TypeError: bufsize must be an integer
(আমি ফেডোরাকে প্রধান ওএস হিসাবে ব্যবহার করছি তাই আমি ব্যবহার করছি)
subprocess.call()
করার সময় subprocess.Popen()
এটি অবরুদ্ধ হচ্ছে ..
এছাড়াও আপনি 'os.popen' ব্যবহার করতে পারেন।
উদাহরণ:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
আউটপুট:
total 16
drwxr-xr-x 2 root root 4096 ago 13 21:53 .
drwxr-xr-x 4 root root 4096 ago 13 01:50 ..
-rw-r--r-- 1 root root 1278 ago 13 21:12 bot.py
-rw-r--r-- 1 root root 77 ago 13 21:53 test.py
None
সাবপ্রসেস মডিউলটি ব্যবহার করুন
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())