পাইথন কোড থেকে শেল স্ক্রিপ্ট কিভাবে কল করবেন?


উত্তর:


252

Subprocess মডিউল আপনাকে সাহায্য করবে।

স্পষ্টতই তুচ্ছ উদাহরণ:

>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0 
>>> 

যেখানে test.shএকটি সরল শেল স্ক্রিপ্ট এবং 0এটি এই রানের জন্য তার মূল মূল্য।


11
দ্রষ্টব্য: সাবপ্রসেসক্লস সমস্ত () স্ট্রিংয়ের পরিবর্তে একটি তালিকা পাস করা ভাল (উদাহরণ এবং কারণগুলির জন্য নীচে হুগো 24-তে কমান্ড দেখুন)।
জিম ডেনিস

1
টিউটোরিয়ালটির লিঙ্কটি নষ্ট হয়ে গেছে।
ক্ষিতিজ সরোগি

6
এটি দেয়: ওএসআরর: [এর্নো ১৩] অনুমতি অস্বীকার করেছে। আমার স্ক্রিপ্ট sudo দিয়ে চালানোর প্রয়োজন হয় না। @Manoj গোবিন্দন
Alper

6
যুক্তি সহ: subprocess.call (['./ test.sh', 'param1', 'param2'])
হেনরি

2
@ আল্পার যেখানে আপনি স্ক্রিপ্টটি রেখেছেন সেই ফোল্ডারে যান এবং কমান্ডটি চালান chmod +x script.sh,। দ্রষ্টব্য: স্ক্রিপ্ট.শ আপনার স্ক্রিপ্টের জন্য স্থানধারক, সেই অনুযায়ী এটি প্রতিস্থাপন করুন।
টম জে মুথিরন্তি

105

os.popen()(অবচয়যুক্ত) বা পুরো subprocessমডিউলটি ব্যবহার করার কিছু উপায় রয়েছে তবে এই পদ্ধতিটি

import os
os.system(command)

সহজতম এক।


1
কেন এটি সবচেয়ে উত্তেজিত উত্তর নয়? একটি মডিউল আরও ভাল সমাধান আমদানি করা হয় না? এখানে কিছু ত্রুটি হতে হবে?
বোল্ডার_রবি

6
subprocessআপনি ইনপুট / আউটপুট / ত্রুটি পাইপ পরিচালনা করতে পারেন সঙ্গে । আপনার অনেক যুক্তি থাকলে এটি আরও ভাল - os.command()আপনার পক্ষে বিশেষ ক্যারেক্টারগুলি এড়িয়ে চলার সাথে পুরো কমান্ড লাইন তৈরি করতে হবে, subprocessসেখানে যুক্তিগুলির সহজ তালিকা রয়েছে। তবে সাধারণ কাজের জন্য os.command() যথেষ্ট হতে পারে।
মিচা নিক্লাস

1
এই লিঙ্কটি থেকে উদ্ধৃতি দিতে:The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
ম্যাক্সিমিলিয়ান

42

আপনি যদি শেল স্ক্রিপ্টে কিছু পরামিতিগুলি পাস করতে চান তবে আপনি 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

এটি মার্জিত।
কালেব


15

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

আমি এটি এর মতো ব্যবহার করি:

subprocess.call(["notepad"])

13
দ্রষ্টব্য: একটি তালিকার সাথে সাবপ্রসেসকে কল করা নিরাপদ কারণ এটি পার্সিং / ব্যাখ্যার জন্য শেলের মাধ্যমে (সম্ভাব্য অচলিত) স্ট্রিংটি পাস করার প্রয়োজন হয় না। তালিকার প্রথম আইটেমটি কার্যকরযোগ্য হবে এবং অন্যান্য সমস্ত আইটেম আর্গুমেন্ট হিসাবে পাস করা হবে be
জিম ডেনিস

13

আমি অজগর 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)

ডক সাবপ্রসেসটি একবার দেখে নিতে ভুলবেন না


1
দ্রষ্টব্য stdout = PIPE বা stderr = PIPE এর সাথে ব্যবহার করবেন না subprocess.call। পাইপগুলি না পড়ার কারণে ওএস পাইপ বাফারটি পূরণ করার জন্য যদি কোনও পাইপে পর্যাপ্ত আউটপুট তৈরি করে তবে শিশু প্রক্রিয়াটি ব্লক হয়ে যাবে।

4

সাবপ্রসেসগুলি চালু করার জন্য সাবপ্রসেস মডিউল একটি ভাল মডিউল। আপনি এটি শেল কমান্ডগুলি কল করতে এটি ব্যবহার করতে পারেন:

subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)

আপনি এখানে এর ডকুমেন্টেশন দেখতে পারেন

যদি আপনার স্ক্রিপ্টটি কিছু .sh ফাইল বা একটি দীর্ঘ স্ট্রিংয়ে লেখা থাকে তবে আপনি ওএস.সিস্টেম মডিউলটি ব্যবহার করতে পারেন। এটি কল করা মোটামুটি সহজ এবং সহজ:

import os
os.system("your command here")
# or
os.system('sh file.sh')

এই কমান্ডটি স্ক্রিপ্টটি একবারে সমাপ্ত হবে এবং এটি প্রস্থান না হওয়া অবধি ব্লক করবে।


আপনি কি sys আমদানি করতে হবে না?
স্কটিব্ল্যাডেস

না, আপনি না; পাইথনের শেলটি খোলার চেষ্টা করুন এবং এই স্নিপেটটি চালাও
দেশক্যারটিস

4

স্ক্রিপ্টে একাধিক যুক্তি রয়েছে

#!/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"

2

সাবপ্রসেস ভাল তবে কিছু লোক স্ক্রিপ্টিন আরও ভাল পছন্দ করতে পারে । Scriptine আরো ভালো পদ্ধতির উচ্চ পর্যায়ের সেট আছে shell.call (args) , path.rename (NEW_NAME) এবং path.move (src, ডিএসটি) । স্ক্রিপ্টাইন উপ-প্রসেস এবং অন্যদের উপর ভিত্তি করে ।

লিপি দুটি ঘাটতি:

  • এটি যথেষ্ট পর্যায়ে থাকলেও বর্তমান ডকুমেন্টেশন স্তরটি আরও বেশি বিস্তৃত হবে।
  • সাবপ্রসেসের বিপরীতে, স্ক্রিপ্টাইন প্যাকেজ বর্তমানে ডিফল্টরূপে ইনস্টল করা নেই।

2

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমি সম্প্রতি এটিকে হোঁচট খেয়েছি এবং অজগর 3.5 এর পরিবর্তিত সাবপ্রসেসি এপিআই হিসাবে এটি আমাকে বিভ্রান্ত করেছিল ।

বাহ্যিক স্ক্রিপ্টগুলি কার্যকর করার নতুন উপায় হ'ল runফাংশনটি, যা আর্গ দ্বারা বর্ণিত কমান্ডটি চালায়। কমান্ডটি সম্পন্ন হওয়ার জন্য অপেক্ষা করে, তারপরে একটি সম্পূর্ণপ্রাপ্ত উদাহরণটি প্রদান করে।

import subprocess

subprocess.run(['./test.sh'])

1

যদি আপনার শেল স্ক্রিপ্ট ফাইলে এক্সিকিউট করার অনুমতি না থাকে তবে নিম্নলিখিত পদ্ধতিতে এটি করুন।

import subprocess
subprocess.run(['/bin/bash', './test.sh'])

-9

নিম্নলিখিত কোডগুলি চেষ্টা করুন:

Import Execute 

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