উত্তর:
Subprocess মডিউল আপনাকে সাহায্য করবে।
স্পষ্টতই তুচ্ছ উদাহরণ:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
যেখানে test.sh
একটি সরল শেল স্ক্রিপ্ট এবং 0
এটি এই রানের জন্য তার মূল মূল্য।
chmod +x script.sh
,। দ্রষ্টব্য: স্ক্রিপ্ট.শ আপনার স্ক্রিপ্টের জন্য স্থানধারক, সেই অনুযায়ী এটি প্রতিস্থাপন করুন।
os.popen()
(অবচয়যুক্ত) বা পুরো subprocess
মডিউলটি ব্যবহার করার কিছু উপায় রয়েছে তবে এই পদ্ধতিটি
import os
os.system(command)
সহজতম এক।
subprocess
আপনি ইনপুট / আউটপুট / ত্রুটি পাইপ পরিচালনা করতে পারেন সঙ্গে । আপনার অনেক যুক্তি থাকলে এটি আরও ভাল - os.command()
আপনার পক্ষে বিশেষ ক্যারেক্টারগুলি এড়িয়ে চলার সাথে পুরো কমান্ড লাইন তৈরি করতে হবে, subprocess
সেখানে যুক্তিগুলির সহজ তালিকা রয়েছে। তবে সাধারণ কাজের জন্য os.command()
যথেষ্ট হতে পারে।
The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
আপনি যদি শেল স্ক্রিপ্টে কিছু পরামিতিগুলি পাস করতে চান তবে আপনি shlex.split পদ্ধতিটি ব্যবহার করতে পারেন :
import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))
সঙ্গে test.sh
একই ফোল্ডারে:
#!/bin/sh
echo $1
echo $2
exit 0
আউটপুট:
$ python test.py
param1
param2
import os
import sys
ধরে নিচ্ছি পরীক্ষা.শ হ'ল শেল স্ক্রিপ্ট যা আপনি চালাতে চান
os.system("sh test.sh")
উপরে বর্ণিত সাব-প্রসেস মডিউলটি ব্যবহার করুন।
আমি এটি এর মতো ব্যবহার করি:
subprocess.call(["notepad"])
আমি অজগর 3.5 চালাচ্ছি এবং সাবপ্রসেসক্লাপল (['./ test.sh']) আমার পক্ষে কাজ করে না।
আমি আপনাকে তিনটি সমাধান দিচ্ছি আউটপুট নিয়ে আপনি কী করতে চান তার উপর নির্ভর করে।
1 - কল স্ক্রিপ্ট। আপনি আপনার টার্মিনালে আউটপুট দেখতে পাবেন। আউটপুট একটি সংখ্যা।
import subprocess
output = subprocess.call(['test.sh'])
2 - কল এবং ডাম্প কার্যকর এবং স্ট্রিং এ ত্রুটি। আপনি প্রিন্ট না করলে আপনি আপনার টার্মিনালটিতে সম্পাদন দেখতে পাবেন না (stdout)। শেল = পোপেনে আর্গুমেন্ট হিসাবে সত্য আমার পক্ষে কাজ করে না।
import subprocess
from subprocess import Popen, PIPE
session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()
if stderr:
raise Exception("Error "+str(stderr))
3 - কল স্ক্রিপ্ট এবং টেম্প_ফাইল মধ্যে টেম্প টেক্সটের ইকো কমান্ড ডাম্প
import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
output = file.read()
print(output)
ডক সাবপ্রসেসটি একবার দেখে নিতে ভুলবেন না
সাবপ্রসেসগুলি চালু করার জন্য সাবপ্রসেস মডিউল একটি ভাল মডিউল। আপনি এটি শেল কমান্ডগুলি কল করতে এটি ব্যবহার করতে পারেন:
subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
আপনি এখানে এর ডকুমেন্টেশন দেখতে পারেন ।
যদি আপনার স্ক্রিপ্টটি কিছু .sh ফাইল বা একটি দীর্ঘ স্ট্রিংয়ে লেখা থাকে তবে আপনি ওএস.সিস্টেম মডিউলটি ব্যবহার করতে পারেন। এটি কল করা মোটামুটি সহজ এবং সহজ:
import os
os.system("your command here")
# or
os.system('sh file.sh')
এই কমান্ডটি স্ক্রিপ্টটি একবারে সমাপ্ত হবে এবং এটি প্রস্থান না হওয়া অবধি ব্লক করবে।
স্ক্রিপ্টে একাধিক যুক্তি রয়েছে
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
আউটপুট স্থিতি কোড দেবে। স্ক্রিপ্টটি সফলভাবে চললে এটি 0 অন্যথায় শূন্য নয় এমন পূর্ণসংখ্যা দেয় ger
podname=xyz serial=1234
0
নীচে টেস্ট.শেল স্ক্রিপ্ট রয়েছে।
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
সাবপ্রসেস ভাল তবে কিছু লোক স্ক্রিপ্টিন আরও ভাল পছন্দ করতে পারে । Scriptine আরো ভালো পদ্ধতির উচ্চ পর্যায়ের সেট আছে shell.call (args) , path.rename (NEW_NAME) এবং path.move (src, ডিএসটি) । স্ক্রিপ্টাইন উপ-প্রসেস এবং অন্যদের উপর ভিত্তি করে ।
লিপি দুটি ঘাটতি:
আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমি সম্প্রতি এটিকে হোঁচট খেয়েছি এবং অজগর 3.5 এর পরিবর্তিত সাবপ্রসেসি এপিআই হিসাবে এটি আমাকে বিভ্রান্ত করেছিল ।
বাহ্যিক স্ক্রিপ্টগুলি কার্যকর করার নতুন উপায় হ'ল run
ফাংশনটি, যা আর্গ দ্বারা বর্ণিত কমান্ডটি চালায়। কমান্ডটি সম্পন্ন হওয়ার জন্য অপেক্ষা করে, তারপরে একটি সম্পূর্ণপ্রাপ্ত উদাহরণটি প্রদান করে।
import subprocess
subprocess.run(['./test.sh'])