質問
RubyおよびPythonのPerlにあるバックティックに相当するものは何ですか?つまり、Rubyではこれを行うことができます。
foo = `cat /tmp/baz`
同等のステートメントはPythonでどのように見えますか? os.system(" cat / tmp / baz")
を試しましたが、結果は標準出力になり、その操作のエラーコードが返されます。
解決
output = os.popen('cat /tmp/baz').read()
他のヒント
最も柔軟な方法は、 サブプロセス
モジュール:
import subprocess
out = subprocess.run(["cat", "/tmp/baz"], capture_output=True)
print("program output:", out)
capture_output
はPython 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
を使用すると、 *
のファイル名展開などが必要な場合にシェルを介してプログラムを実行できますが、これには制限。
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)
または、そこにディレクトリがないことを確認できる場合は、1行に収めることができます:
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"])
Python 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)$ 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&quot ;," arg"]
with
" prog arg"
必要なシェル拡張動作を取得しました(Perlの `prog arg`に類似)
print subprocess.Popen(" ls -ld / tmp / v *&quot ;, stdout = subprocess.PIPE、shell = True).communicate()[0]
perl `cmd ...`に相当することの難しさに悩まされていたので、しばらくしてpythonの使用をやめました。 Pythonがこれを合理的にしたことを嬉しく思います。
subprocess.Popenを使用する場合は、bufsizeを忘れずに指定してください。デフォルトは0です。これは、「妥当なデフォルトを選択する」ではなく、「バッファなし」を意味します。
これはpython3では機能しませんが、python2では、シェルコマンドを呼び出して次のように返すカスタムの __ repr __
メソッドで str
を拡張できます:
#!/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()
。