অজগর থেকে বাশ স্ক্রিপ্ট চলছে


114

নিম্নলিখিত কোডগুলি নিয়ে আমার সমস্যা আছে:

কলব্যাশ.পি:

import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"

নিদ্রা.শ:

sleep 10

আমি চাই দশকের পরে "শেষ" মুদ্রিত করা হোক। (আমি জানি এটি একটি বোবা উদাহরণ, আমি কেবল অজগরের মধ্যে ঘুমাতে পারতাম, তবে এই সাধারণ স্লিপ.শ ফাইলটি পরীক্ষার মতোই ছিল)


আমি এটি "bin! বিন / বাশ; ঘুম 10;"
দিয়েও ব্যবহার করে দেখেছি

এই অনুসন্ধানটি কোন সমস্যাটি জিজ্ঞাসা করার চেষ্টা করছে তা স্পষ্ট নয়, তবে সম্ভবত প্রশ্নটি থাকা উচিত কারণ এটি উত্তর হিসাবে কম বা কম ভাল অনুমানের একটি historicalতিহাসিক গ্র্যাব ব্যাগকে অর্জিত করেছে। সম্ভবত আপনার নির্দিষ্ট ত্রুটির জন্য অনুসন্ধান, এবং / অথবা মত সংশ্লিষ্ট প্রশ্নের পড়া stackoverflow.com/questions/4256107/...
tripleee

উত্তর:


96

স্লিপ.শকে এক্সিকিউটেবল করা এবং shell=Trueপ্যারামিটার তালিকায় যুক্ত করা (আগের উত্তরগুলিতে প্রস্তাবিত হিসাবে) ঠিক আছে। অনুসন্ধানের পথের উপর নির্ভর করে আপনার যুক্ত করতে ./বা অন্য কোনও উপযুক্ত পাথের প্রয়োজন হতে পারে। (অর্থাৎ এতে পরিবর্তন "sleep.sh"করুন "./sleep.sh"))

shell=Trueবাশ স্ক্রিপ্টের প্রথম লাইনটি যদি শেলের পথ হয় তবে প্যারামিটারের প্রয়োজন নেই (লিনাক্সের মতো পসিক্স সিস্টেমের আওতায়); উদাহরণস্বরূপ #!/bin/bash,।


52

যদি sleep.shশেবাং থাকে #!/bin/shএবং এতে যথাযথ ফাইলের অনুমতি থাকে - chmod u+rx sleep.shতা নিশ্চিত করতে চালান এবং এটি এতে রয়েছে $PATHতবে আপনার কোডটি যেমন হয় তেমন কাজ করা উচিত:

import subprocess

rc = subprocess.call("sleep.sh")

স্ক্রিপ্টটি যদি PATH তে না থাকে তবে তার সম্পূর্ণ পথটি নির্দিষ্ট করুন যেমন, এটি যদি বর্তমান ওয়ার্কিং ডিরেক্টরিতে থাকে:

from subprocess import call

rc = call("./sleep.sh")

যদি স্ক্রিপ্টটির কোনও শেবাং না থাকে তবে আপনাকে উল্লেখ করতে হবে shell=True:

rc = call("./sleep.sh", shell=True)

যদি স্ক্রিপ্টটির কোনও এক্সিকিউটেবল অনুমতি থাকে না এবং আপনি এটি পরিবর্তন করতে না পারেন যেমন, দৌড়াতে os.chmod('sleep.sh', 0o755)আপনি স্ক্রিপ্টটি একটি পাঠ্য ফাইল হিসাবে পড়তে পারেন এবং স্ট্রিংটির subprocessপরিবর্তে মডিউলটিতে পাঠাতে পারেন :

with open('sleep.sh', 'rb') as file:
    script = file.read()
rc = call(script, shell=True)

35

আসলে, আপনাকে কেবল shell=Trueযুক্তি যুক্ত করতে হবে :

subprocess.call("sleep.sh", shell=True)

তবে সাবধান -

সতর্কতা শেল = সিস্টেমের সাথে শেলটি চালনা করা অবিশ্বস্ত ইনপুটটির সাথে একত্রিত হলে সুরক্ষা বিপত্তি হতে পারে ard বিশদ জন্য ঘন ঘন ব্যবহৃত যুক্তিগুলির অধীনে সতর্কতাটি দেখুন।

সূত্র


4
এর sleep.shমধ্যে না থাকলে এটি কাজ করবে না PATH। আর এটা যদি হয় পাথ এবং এটি সঠিক কুঁড়েঘর দেয়া থাকে তবে আপনাকে প্রয়োজন হবে না shell=Trueআমার উত্তর
jfs

19

যদি কেউ যুক্তি দিয়ে কোনও স্ক্রিপ্ট কল করার সন্ধান করে

import subprocess

val = subprocess.check_call("./script.sh '%s'" % arg, shell=True)

স্ট্র (আরগ) ব্যবহার করে পাস করার আগে আরগগুলি স্ট্রিংয়ে রূপান্তর করতে ভুলবেন না।

এটি পছন্দমতো যতগুলি আর্গুমেন্ট পাস করতে ব্যবহার করা যেতে পারে:

subprocess.check_call("./script.ksh %s %s %s" % (arg1, str(arg2), arg3), shell=True)

11

sleep.shএটি কার্যকর করার অনুমতি রয়েছে তা নিশ্চিত করুন এবং এটি দিয়ে চালান shell=True:

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"

সুতরাং এটি শেল = সত্য আমি মিস করেছি। আপনি কী ব্যাখ্যা করতে পারবেন, কেন sh স্ক্রিপ্টের প্রথম লাইনে #! বিন / বাশ সেট করা যথেষ্ট নয়?
ব্যবহারকারী1638145

4
ত্রুটিটি #!bin/bashএকটি অনুপস্থিত /#!/bin/bashআমি একটি উত্তরে নোট হিসাবে কাজ করে।
জেমস ওয়াল্ডবি - jwpat7

10

যদি chmod কাজ না করে তবে আপনিও চেষ্টা করুন

import os
os.system('sh script.sh')
#you can also use bash instead of sh

আমার দ্বারা পরীক্ষা ধন্যবাদ


os.systemডকুমেন্টেশন বিশেষভাবে পক্ষে এটা এড়ানো পরামর্শ দেওয়া হচ্ছে subprocess(এই দিন, subprocess.run())। আপনি যদি subprocessকাজে না আসতে পারেন তবে সম্ভাবনা হ'ল os.system()আপনারও খুব সমস্যা হবে।
ট্রিপলি

3

উত্তর যুক্ত করা হচ্ছে কারণ পাইথন থেকে বাশ স্ক্রিপ্টটি কীভাবে চালানো যায় তা জিজ্ঞাসা করার পরে আমাকে এখানে নির্দেশ দেওয়া হয়েছিল। OSError: [Errno 2] file not foundআপনার স্ক্রিপ্টটি প্যারামিটারে নিলে আপনি একটি ত্রুটি পাবেন । উদাহরণস্বরূপ বলুন আপনার স্ক্রিপ্টটি ঘুমের সময় প্যারামিটারে নিয়েছে: subprocess.call("sleep.sh 10")কাজ করবে না, আপনাকে অবশ্যই এটি অ্যারে হিসাবে পাস করতে হবে:subprocess.call(["sleep.sh", 10])


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