Pythonスクリプトはターミナルでコマンドを実行します


109

私はこれを少し前にどこかで読みましたが、見つけられないようです。端末でコマンドを実行し、結果を出力するコマンドを見つけようとしています。

たとえば、スクリプトは次のようになります。

command 'ls -l'

端末でそのコマンドを実行した結果が出力されます

回答:


198

これにはいくつかの方法があります。

簡単な方法はosモジュールを使用することです:

import os
os.system("ls -l")

より複雑なことは、サブプロセスモジュールで実現できます。次に例を示します。

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]

43
私はあなたに反対票を投じたくありませんが。すべてに対してサブプロセスを使用する必要があります。より安全です。subprocess.call()は、単純な呼び出しフォームを置き換えるための優れたインターフェースを提供します。
ホルヘバルガス

その答えの仲間をありがとう。Ubuntuデスクトップで最初のアプリケーションにpythonを使用します。これは本当に役に立ちます。
LinuxBill 2013年

1
コマンドの完全な応答を取得するにはどうすればよいですか。os.system("nslookup gmail.com")最後の行だけが返されます0が、完全な応答を取得したいのですが。
Parthapratim Neog、2015年

3
@JorgeVargasなぜすべてにサブプロセスを使用する必要があるのか​​理解していただけますか?なぜ安全なのですか?
Soutzikevich

38

私はサブプロセスモジュールの使用を好みます:

from subprocess import call
call(["ls", "-l"])

理由は、スクリプトで変数を渡したい場合、これは非常に簡単な方法を提供するためです。たとえば、コードの次の部分をとります

abc = a.c
call(["vim", abc])

追加のパラメーターを使用して画像を開くとうまくいきましたcall(["eog", "1breeproposal.png", "-f"])
Josh


4

また、commands.getstatusoutputも確認する必要があります。

これは長さ2のタプルを返します。最初は戻り整数(0-コマンドが成功した場合)で、2番目は端末に表示される出力全体です。

lsの場合

    import commands
    s=commands.getstatusoutput('ls')
    print s
    >> (0, 'file_1\nfile_2\nfile_3')
    s[1].split("\n")
    >> ['file_1', 'file_2', 'file_3']

2
import os
os.system("echo 'hello world'")

これはうまくいくはずです。出力をpythonシェルに出力する方法がわかりません。



1

ジュピター

jupyterノートブックでは、マジック関数を使用できます !

!echo "execute a command"
files = !ls -a /data/dir/ #get the output into a variable

ipython

これを.pyスクリプトとして実行するには、使用する必要がありますipython

files = get_ipython().getoutput('ls -a /data/dir/')

スクリプトを実行する

$ ipython my_script.py

0

'os'モジュールをインポートして、次のように使用できます。

import os
os.system('#DesiredAction')

0

python3の場合はサブプロセスを使用します

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.