سؤال

ما هو ما يعادل backticks وجدت في روبي و Perl في الثعبان ؟ هذا هو في روبي أستطيع أن أفعل هذا:

foo = `cat /tmp/baz`

ما يعادل بيان تبدو في الثعبان ؟ لقد حاولت os.system("cat /tmp/baz") ولكن أن يضع النتيجة القياسية و ترجع لي رمز الخطأ في هذه العملية.

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

والطريقة الأكثر مرونة هو استخدام subprocess حدة:

import subprocess

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

وقدم capture_output في بيثون 3.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 لتنفيذ البرنامج من خلال وعاء، وإذا كنت بحاجة إلى أشياء مثل التوسعات اسم ملف *، ولكن هذا يأتي مع <لأ href = "https://docs.python.org/3/library/subprocess. أتش تي أم أل #-اعتبارات أمنية "يختلط =" نوفولو noreferrer "> القيود .

لك شيء غير الحق . يمكنك أيضا استخدام os.popen ()، ولكن إن وجدت (بايثون 2.4+) فرعي أو جانبي هو الأفضل بشكل عام.

ولكن، خلافا لبعض اللغات التي تشجع على ذلك، وانها تعتبر عموما شكل سيء لتفرخ فرعي أو جانبي حيث يمكنك القيام بنفس العمل داخل اللغة. انها أبطأ، أقل موثوقية والتي تعتمد على النظام الأساسي. ومثال الخاص بك سيكون أفضل حالا على النحو التالي:

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))
foo = subprocess.check_output(["cat", "/tmp/baz"])

من بيثون 3.5 فصاعدا ، الطريقة الموصى بها هي استخدام subprocess.run.للحصول على نفس السلوك كما تصف يمكنك استخدام:

output = subprocess.run("ls", shell=True, stdout=subprocess.PIPE).stdout

هذا سيعود bytes الكائن.قد ترغب في إلحاق .decode("ascii") أو .decode("utf-8") إلى النهاية للحصول على str.

وأسهل طريقة هي استخدام حزمة الأوامر.

import commands

commands.getoutput("whoami")

وإخراج:

<اقتباس فقرة>   

'bganesan'

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

وأنا أستخدم

<اقتباس فقرة>   

و(6: 0) $ الثعبان --version   بايثون 2.7.1

واحد من الأمثلة أعلاه:

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

وبالنسبة لي، وهذا فشل في الوصول إلى الدليل / تمة. بعد النظر في سلسلة وثيقة لفرعي أو جانبي أنا محل

<اقتباس فقرة>   

[ "بروغ"، "وسيطة"]

مع

<اقتباس فقرة>   

و"ARG بروغ"

وحصل على السلوك التوسع القذيفة التي كان المطلوب (على غرار بيرل `بروغ arg`)

<اقتباس فقرة>   

وsubprocess.Popen طباعة ( "ليرة سورية -ld / تمة / ت *"، المعياري = subprocess.PIPE، قذيفة = صحيح) .communicate () [0]


وأستقيل استخدام الثعبان في حين يعود لأنني كنت منزعج مع صعوبة في القيام بما يعادل بيرل `` كمد .... أنا سعيد لتجد بيثون جعلت هذا معقول.

إذا كنت تستخدم subprocess.Popen، وتذكر لتحديد bufsize. الافتراضي هو 0، والذي يعني "غير مصقول"، وليس "اختيار الافتراضي معقول".

وهذا لن ينجح في python3، ولكن في python2 يمكنك توسيع 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`

ووbacktick ( `) المشغل على في Python 3. ومن مشابها لسعر واحد، ويصعب كتابة على بعض لوحات المفاتيح. بدلا من backtick، استخدم ما يعادل المدمج في وظيفة repr() .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top