কীভাবে পাইথন স্ক্রিপ্টে ব্যাশ কমান্ড কার্যকর করা যায়


উত্তর:


17

@ মিলনের উত্তর কাজ করে 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()

এটি ব্যবহার করা বাঞ্ছনীয় (Is os.popenবা os.system), উদা: res = os.popen('sudo apt update').read()? @Anthon
Alper

1
@ আল্পার পড়ুন 0324 পাইথন.আর.দেব / পেপস / পেপ-0324 । এটি subprocessযদিও তৈরি করার যুক্তিটি ব্যাখ্যা করে os.systemএবং os.popenইতিমধ্যে বিদ্যমান ছিল। এই জাতীয় পিইপি গ্রহণযোগ্য হওয়ার জন্য অ-তুচ্ছ হয়। আপনার বা আমি কখনও যা করব তার চেয়ে বেশিরভাগ লোক এ বিষয়ে অনেক বেশি চিন্তাভাবনা করেছে। এবং subprocess২০০৩ সাল থেকে উন্নতি হয়েছে, অন্যরা এখনও পিছিয়ে সামঞ্জস্যের জন্য রয়েছে। আপনি কি os.systemম্যানুয়াল পৃষ্ঠাটি লাল করেছেন : সাবপ্রসেস মডিউলটি নতুন প্রক্রিয়া তৈরির এবং তাদের ফলাফল পুনরুদ্ধারের জন্য আরও শক্তিশালী সুবিধা সরবরাহ করে; এই ফাংশনটি ব্যবহার করার জন্য সেই মডিউলটি ব্যবহার করা ভাল।
অ্যান্থন

1
@ আল্পার হ্যাঁ আপনি করতে পারেন। আমি যেমন একটি সম্ভাব্য সুরক্ষা বিপত্তি হিসাবে ইঙ্গিত করেছি, তাই কেন আপনি এটির প্রস্তাবিত বলে মনে করেন তা আমি জানি না। এবং অনুরোধ sudoশুধুমাত্র আরও তীব্র করতে চলেছে। হতে পারে পাইথন-এপটি ব্যবহার করা আরও ভাল সমাধান (আমি নিজে এটি দেখিনি)।
অ্যান্থন

1
@alper যে ক্ষেত্রে একটি গুরুতর কটাক্ষপাত সীসা , এটা যে সঙ্গে গতি বাড়াতে পেয়ে মূল্য।
অ্যান্থন

1
@ আল্পার আপনি পাইথন 3 এ থাকলে পাইথন 2 তে আপনার এটি করা দরকার। এখানে মন্তব্যটি কোনও চ্যাট সিস্টেম হিসাবে ব্যবহার করবেন না। আপনার যদি কোনও প্রশ্ন থাকে তবে তা পোস্ট করুন।
অ্যান্থন

8

কমান্ডগুলি কার্যকর করার জন্য আপনি প্যাসামিটার -c দিয়ে বাশাকে প্রোগ্রাম হিসাবে ব্যবহার করতে পারবেন:

উদাহরণ:

bashCommand = "sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])

7

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 (আমি ফেডোরাকে প্রধান ওএস হিসাবে ব্যবহার করছি তাই আমি ব্যবহার করছি)
ড্রিমর

3
আপনি স্কোয়ার বন্ধনীগুলি ভুলে গেছেন
মিলিন্ড ডুম্বারে

1
এছাড়াও মনে রাখবেন যে অ-ব্লক subprocess.call()করার সময় subprocess.Popen()এটি অবরুদ্ধ হচ্ছে ..
হিমেইল

"ব্লক" বলতে কী বোঝ? @heemayl
Alper

2

এছাড়াও আপনি '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

0

সাবপ্রসেস মডিউলটি ব্যবহার করুন

import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())

আমি যখন এটি ব্যবহার করি তখন কেন আমি ত্রুটি পাচ্ছি
অ্যাকাগ্রেমলিন

subprocess.check_call (["sudo", "apt", "আপডেট"])
অ্যাকাগ্রামলিন

কল করা প্রসেসরর ট্রেসব্যাক (সর্বশেষতম কলটি শেষ) <মডেল> () ----> 1 সাবপ্রসেসক্ল্যাক_ক্যাল (["সুডো", "আপ্ট", "আপডেট"]) / ইউএসআর / এ << পিথন-ইনপুট-21-33ce645708e7> lib / python2.7 / subprocess.pyc in check_call (* popenargs, ** kwargs) 188 সেমিডি না হলে: 189 সেন্টিমিটার = popenargs [0] -> 190 উত্থাপন কল্ডপ্রসেসেরর (retcode, cmd) 191 রিটার্ন 0 192 কলযুক্তপ্রসারণ: আদেশ '[' সুডো ','
আপ্ট

এই ত্রুটিটি তখনই ঘটে যখন আমি এটি একটি বৃহত্তর নোটবুকে
চালাচ্ছি

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