পাইথনে ব্যাশ ব্যাকটিক্সের সমতুল্য [সদৃশ]


85

পাইথনের রুবি এবং পার্লের ব্যাকটিকসের সমতুল্য কী? অর্থাৎ রুবিতে আমি এটি করতে পারি:

foo = `cat /tmp/baz`

পাইথনের সমতুল্য বিবৃতিটি দেখতে কেমন? আমি চেষ্টা করেছি os.system("cat /tmp/baz")কিন্তু এটি ফলাফলটিকে স্ট্যান্ডার্ড করে দিয়েছে এবং সেই অপারেশনের ত্রুটি কোডটি আমাকে ফিরিয়ে দেয়।


উত্তর:


101
output = os.popen('cat /tmp/baz').read()

4
@ এমকেনজম প্রশ্নটি একটি বাহ্যিক প্রক্রিয়ার আউটপুট ক্যাপচার সম্পর্কে। পাইথন ফাংশনের আউটপুট ক্যাপচার করা একেবারে আলাদা প্রশ্ন।
জন কুগেলম্যান

4
আশ্চর্যজনকভাবে সংক্ষিপ্ত, এবং প্রকৃতপক্ষে `...`রুবি'র সমতুল্য (স্টাডাউট ক্যাপচারিং, স্ট্ডারকে পাশ কাটিয়ে) - একটি ব্যতিক্রম সহ: রুবি প্রক্রিয়াটির 'প্রস্থান কোড নির্ধারণের অনুমতি দেয় $?; পাইথনে, আমি যা বলতে পারি তা থেকে আপনাকে তার জন্য subprocessমডিউলটির কাজগুলি ব্যবহার করতে হবে।
mklement0

82

subprocessমডিউলটি ব্যবহার করা সবচেয়ে নমনীয় উপায় :

import subprocess

out = subprocess.run(["cat", "/tmp/baz"], capture_output=True)
print("program output:", out)

capture_outputপাইথন ৩.7 এ প্রবর্তন করা হয়েছিল, পুরানো সংস্করণগুলির জন্য বিশেষ ফাংশন check_output()পরিবর্তে ব্যবহার করা যেতে পারে:

out = subprocess.check_output(["cat", "/tmp/baz"])

আপনার যদি সূক্ষ্ম শস্যযুক্ত নিয়ন্ত্রণের প্রয়োজন হয় তবে আপনি নিজে হাতে একটি সাবপ্রসেস অবজেক্টও তৈরি করতে পারেন:

proc = subprocess.Popen(["cat", "/tmp/baz"], stdout=subprocess.PIPE)
(out, err) = proc.communicate()

এই সমস্ত ফাংশন কী- ওয়ার্ড প্যারামিটারগুলিকে সমর্থন করে ঠিক কীভাবে সাবপ্রসেসটি কার্যকর করা হয় তা কাস্টমাইজ করতে। আপনি উদাহরণস্বরূপ shell=Trueশেলটির মাধ্যমে প্রোগ্রামটি কার্যকর করতে ব্যবহার করতে পারেন, যদি আপনার ফাইলের নাম সম্প্রসারণের মতো জিনিসগুলির প্রয়োজন হয় *তবে এটি সীমাবদ্ধতার সাথে আসে ।


4
হ্যাঁ, এটিই একমাত্র বোধগম্য উপায়, আপনি এটি কোনও ফাংশনে মুড়িয়ে রাখতে পারেন যাতে আপনি এক্সিকিউট ("কমান্ড") এর মতো কিছু বলতে পারেন
ভিনকো ভার্সালভিক

এটি আসলে আমার পক্ষে কাজ করে না, যেমন এই ক্ষেত্রে, বাজ একটি ডিরেক্টরি এবং আমি সেই ডিরেক্টরিতে থাকা সমস্ত ফাইলের বিষয়বস্তু পাওয়ার চেষ্টা করছি। (বিড়াল / টিএমপি / বাজ / * টিক্সে কাজ করে তবে এখানে বর্ণিত পদ্ধতিটির মাধ্যমে নয়)
ক্রিস বাঞ্চ

6
পুনরায়: "*" কাজ করে না; পরিবর্তে সাবপ্রসেস.পোপেন (["বিড়াল", "/ টিএমপি / বাজ"]), স্টডআউট = সাবপ্রসেস.পিআইপিই, শেল = ট্রু) ব্যবহার করুন। যেহেতু গ্লোব (তারকা) সম্প্রসারণ শেল দ্বারা পরিচালিত হয়, সাব-প্রসেসিং মডিউলটিকে অবশ্যই এই ক্ষেত্রে শেল প্রসারিত ব্যবহার করতে হবে (/ বিন / শি দ্বারা সরবরাহিত)।
প্যাসি সাভোলাইনেন

4
Docs.python.org/2/library/subprocess.html#popen-constructor থেকে : "(শেল = ট্রু সহ) যদি আর্গুমেন্ট একটি সিকোয়েন্স হয় তবে প্রথম আইটেমটি কমান্ড স্ট্রিং নির্দিষ্ট করে, এবং কোনও অতিরিক্ত আইটেম অতিরিক্ত আর্গুমেন্ট হিসাবে বিবেচিত হবে শেল নিজেই। " সুতরাং, আপনি যদি শেল = সত্য ব্যবহার করতে চলেছেন তবে প্রথম আর্গটি সম্ভবত "বিড়াল / টিএমপি / বাজ" স্ট্রিং হওয়া উচিত। বিকল্পভাবে, আপনি যদি প্রথম
আরগ

4
@ জিরিট: এটি হ্রাস করা হয় না। ডক্সগুলি সুপারিশ করে subprocess.run() (এটি প্রাপ্য কিনা তা আমি জানি না) যদি আপনার পূর্ববর্তী সংস্করণগুলি সমর্থন করার প্রয়োজন না হয় বা আপনার সরবরাহিত নমনীয়তার প্রয়োজন হয় না Popen()
jfs

27

sth ঠিক আছে । আপনি ওএস.পোপেন () ব্যবহার করতে পারেন তবে যেখানে উপলব্ধ (পাইথন ২.৪++) সাবপ্রসেসটি সাধারণত পছন্দনীয়।

যাইহোক, কিছু ভাষাগুলি এটির উত্সাহ দেয় না তার বিপরীতে, এটি সাধারণত এমন একটি সাব-প্রসেস তৈরি করতে খারাপ রূপ হিসাবে বিবেচিত হয় যেখানে আপনি ভাষার ভিতরে একই কাজ করতে পারেন। এটি ধীর, কম নির্ভরযোগ্য এবং প্ল্যাটফর্ম নির্ভর। আপনার উদাহরণ হিসাবে ভাল হবে:

foo= open('/tmp/baz').read()

এবং:

বাজ একটি ডিরেক্টরি এবং আমি সেই ডিরেক্টরিতে থাকা সমস্ত ফাইলের বিষয়বস্তু পাওয়ার চেষ্টা করছি

? ডিরেক্টরিতে বিড়াল আমাকে ত্রুটি দেয়।

আপনি যদি ফাইলগুলির একটি তালিকা চান:

import os
foo= os.listdir('/tmp/baz')

আপনি যদি কোনও ডিরেক্টরিতে সমস্ত ফাইলের সামগ্রী চান তবে এর মতো কিছু:

contents= []
for leaf in os.listdir('/tmp/baz'):
    path= os.path.join('/tmp/baz', leaf)
    if os.path.isfile(path):
        contents.append(open(path, 'rb').read())
foo= ''.join(contents)

বা, আপনি যদি নিশ্চিত হন যে সেখানে কোনও ডিরেক্টরি নেই তবে আপনি এটি ওয়ান-লাইনারে ফিট করতে পারেন:

path= '/tmp/baz'
foo= ''.join(open(os.path.join(path, child), 'rb').read() for child in os.listdir(path))

4
যদিও এটি প্রশ্নের উত্তর ছিল না, এটি ব্যবহারকারীদের শিক্ষিত করার জন্য সেরা উত্তর।
noamtm

4
প্রশ্নের শিরোনাম "ব্যাকটিক্সের সমতুল্য কী"। আমি ধরে নিয়েছিলাম যে "বিড়াল" কেবল উদাহরণ কমান্ড ছিল। এই উত্তরটি সাধারণ ক্ষেত্রে সহায়তা করে না।
জেসন

15
foo = subprocess.check_output(["cat", "/tmp/baz"])

4
এটি এখন সবচেয়ে সোজা উপায়। পাইথন ২.7-এ "সাবপ্রোসেস.সেক_আউটপুট" যুক্ত করা হয়েছিল যা অন্য "পোপেন" উত্তর দেওয়ার পরে জুলাই ২০১০ সালে প্রকাশিত হয়েছিল।
রবার্ট ফ্লেমিং

10

পাইথন 3.5 পরে, প্রস্তাবিত উপায় ব্যবহার করা হয় subprocess.run। পাইথন ৩.7 থেকে আপনার বর্ণনা অনুসারে একই আচরণ পেতে আপনি ব্যবহার করবেন:

cpe = subprocess.run("ls", shell=True, capture_output=True)

এটি কোনও subprocess.CompletedProcessবস্তু ফেরত দেবে । স্ট্যান্ডআউট cpe.stdoutথেকে আউটপুট আসবে, স্টার্ডার থেকে আউটপুট আসবে cpe.stderr, যা উভয়ই bytesবস্তু হবে। আপনি কোনও strঅবজেক্টটি ব্যবহার করে আউটপুটটি ডিকোড করতে cpe.stdout.decode()বা ব্যবহার করে একটি পেতে text=Trueপারেন subprocess.run:

cpe = subprocess.run("ls", shell=True, capture_output=True, text=True)

পরবর্তী ক্ষেত্রে, cpe.stdoutএবং cpe.stderrউভয় strঅবজেক্ট।


পাইথন ৩.7 থেকে আপনি text=Trueপ্যারামিটারটি ব্যবহার করে বাইটের পরিবর্তে আরআরটি ফিরে পেতে পারেন ।
bwv549


3
import os
foo = os.popen('cat /tmp/baz', 'r').read()

4
এটি রুবির ব্যাকটিক্সের সমতুল্য, তবে যদি আপনার সমস্যাটি যদি কোনও ডিরেক্টরিের বিষয়বস্তু তালিকাভুক্ত করা হয় তবে এটি করার সেরা উপায় এটি নয়।

2

আমি ব্যাবহার করছি

(6: 0) $ পাইথন - রূপান্তর পাইথন 2.7.1

উপরের উদাহরণগুলির মধ্যে একটি:

import subprocess
proc = subprocess.Popen(["cat", "/tmp/baz"], stdout=subprocess.PIPE, shell=True)
(out, err) = proc.communicate()
print "program output:", out

আমার জন্য, এটি ডিরেক্টরি / টিএমপি অ্যাক্সেস করতে ব্যর্থ হয়েছে। সাবপ্রসেসের জন্য ডক স্ট্রিংটি দেখার পরে আমি প্রতিস্থাপন করেছি

["প্রগ", "আরগ"]

সঙ্গে

"প্রগ আরগ"

এবং শেল সম্প্রসারণ আচরণটি পছন্দসই হয়েছিল (একটি লা পার্লের `প্রগ আর্গ)

মুদ্রণ সাবপ্রসেস.পোপেন ("ls -ld / tmp / v *", stdout = subprocess.PIPE, শেল = সত্য) .কমুনিকেট () [0]


আমি কিছুক্ষণ আগে পাইথন ব্যবহার বন্ধ করে দিয়েছিলাম কারণ পার্ল `সেমিডি ...` এর সমতুল্য করার অসুবিধা নিয়ে আমি বিরক্ত হয়েছিলাম ` পাইথন এটি যুক্তিসঙ্গত করে তুলেছে বলে আমি আনন্দিত।


1

আপনি যদি সাবপ্রসেস.পোপেন ব্যবহার করেন তবে বুফসাইজ নির্দিষ্ট করতে ভুলবেন না। ডিফল্টটি 0 হয়, যার অর্থ "আনফারড", "যুক্তিসঙ্গত ডিফল্ট চয়ন করা হয় না"।


1

এটি পাইথন 3 এ কাজ করবে না, তবে পাইথন 2 এ আপনি strএকটি কাস্টম __repr__পদ্ধতিতে প্রসারিত করতে পারেন যা আপনার শেল কমান্ডকে কল করে এবং এটির মতো ফেরত দেয়:

#!/usr/bin/env python

import os

class Command(str):
    """Call system commands"""

    def __repr__(cmd):
        return os.popen(cmd).read()

যা আপনি ব্যবহার করতে পারেন

#!/usr/bin/env python
from command import Command

who_i_am = `Command('whoami')`

# Or predeclare your shell command strings
whoami = Command('whoami')
who_i_am = `whoami`

4
এছাড়াও আপনার সম্ভবত এটি করা উচিত নয় *
থারস্ম্মোনার

-1

repr()

backtick( `) অপারেটর সরানো হয়েছে মধ্যে Python 3। এটি বিভ্রান্তিকরভাবে একক উদ্ধৃতির সাথে সমান এবং কিছু কীবোর্ডে টাইপ করা শক্ত। এর পরিবর্তে, backtickসমতুল্য অন্তর্নির্মিত ফাংশনটি ব্যবহার করুন repr()


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