88

PythonのRubyとPerlにあるバックティックに相当するものは何ですか?つまり、Rubyでは次のことができます。

foo = `cat /tmp/baz`

Pythonでの同等のステートメントはどのように見えますか?私は試しましos.system("cat /tmp/baz")たが、結果が標準になり、その操作のエラーコードが返されます。

4

11 に答える 11

107
output = os.popen('cat /tmp/baz').read()
于 2009-09-11T13:53:48.113 に答える
85

最も柔軟な方法は、subprocessモジュールを使用することです。

import subprocess

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

capture_outputPython 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たとえば、のファイル名拡張などが必要な場合は、シェルを介してプログラムを実行するために使用できます*が、これには制限があります。

于 2009-09-11T13:52:17.243 に答える
28

sthは正しいです。os.popen()を使用することもできますが、利用可能な場合(Python 2.4以降)のサブプロセスが一般的に推奨されます。

ただし、それを奨励する一部の言語とは異なり、言語内で同じジョブを実行できるサブプロセスを生成することは、一般的に悪い形式と見なされます。速度が遅く、信頼性が低く、プラットフォームに依存します。あなたの例は次のようにしたほうがよいでしょう:

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

eta:

bazはディレクトリであり、そのディレクトリ内のすべてのファイルの内容を取得しようとしています

?ディレクトリ上の猫は私にエラーを取得します。

ファイルのリストが必要な場合:

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))
于 2009-09-11T14:00:11.497 に答える
16
foo = subprocess.check_output(["cat", "/tmp/baz"])
于 2011-09-19T09:58:22.763 に答える
12

Python 3.5以降では、を使用することをお勧めしますsubprocess.run。Python 3.7以降、説明したのと同じ動作を得るには、次を使用します。

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

これにより、オブジェクトが返されsubprocess.CompletedProcessます。stdoutへの出力はになり、cpe.stdoutstderrへの出力はになります。cpe.stderrこれは両方ともbytesオブジェクトになります。を使用して出力をデコードし、strオブジェクトを取得するか、 :cpe.stdout.decode()に渡すtext=Trueことで取得できます。subprocess.run

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

後者の場合、cpe.stdoutcpe.stderrは両方ともstrオブジェクトです。

于 2016-03-22T16:39:33.270 に答える
6

最も簡単な方法は、コマンドパッケージを使用することです。

import commands

commands.getoutput("whoami")

出力:

'bganesan'

于 2014-07-28T17:48:01.213 に答える
3
import os
foo = os.popen('cat /tmp/baz', 'r').read()
于 2009-09-11T13:55:24.663 に答える
2

使っています

(6:0)$ python --version Python 2.7.1

上記の例の1つは次のとおりです。

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

私の場合、これはディレクトリ/tmpにアクセスできませんでした。サブプロセスのドキュメント文字列を確認した後、置き換えました

["prog"、 "arg"]

「progarg」

必要なシェル拡張動作を取得しました(alaPerlの`progarg`)

print subprocess.Popen( "ls -ld / tmp / v *"、stdout = subprocess.PIPE、shell = True).communicate()[0]


perl `cmd ...`と同等のことをするのが難しいことに悩まされたので、しばらく前にpythonの使用をやめました。Pythonがこれを合理的にしているのを見つけてうれしいです。

于 2011-03-11T23:13:34.750 に答える
1

subprocess.Popenを使用する場合は、bufsizeを指定することを忘れないでください。デフォルトは0です。これは、「適切なデフォルトを選択する」ではなく、「バッファリングされていない」ことを意味します。

于 2010-04-13T02:55:41.623 に答える
1

これは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`
于 2015-04-19T19:48:17.440 に答える
-1

repr()

backtick`)演算子はで削除されましたPython 3。紛らわしいことに一重引用符に似ており、一部のキーボードでは入力が困難です。の代わりにbacktick、同等の組み込み関数を使用しますrepr()

于 2019-04-09T19:51:45.080 に答える