【python運転次元】pythonがshellコマンドを実行する4つの方法


Pythonは、他のプログラムを簡単に操作し、他の言語で書かれたライブラリを簡単にパッケージできるため、「接着言語」と呼ばれることが多い.今日は、PythonでShellコマンドを呼び出す方法の1つについて説明します.
PythonでShellコマンドを呼び出すには、次のような方法があります.
1つ目:os.system(“The command you want”)
この呼び出しはかなり直接的で、同期的に行われ、プログラムはブロックされ、戻るのを待つ必要があります.戻り値はシステムに依存し、直接システムの呼び出し戻り値を返すのでwindowsとlinuxは違います.
2つ目:os.popen(command[,mode[,bufsize]])では、まず例を示します
>>> import os
>>> p = os.popen("dir c:", 'r')
>>> p.read()
bla bla... <   dir     >
>>> p.close()
>>> p = os.popen("dir d:", 'r') #      D 
>>> p.read()
''
>>> p.close()
1
>>>

popen法はp.read()により端末出力を取得する、popenはclose()を閉じる必要があることがわかる.実行に成功するとclose()は値を返さず、失敗するとclose()はシステムの戻り値を返す.戻り値の取得方法とosが表示されます.システムが違います.
3つ目はcommandsモジュールを使用して、同じように例を見ます.
>>> import commands
>>> commands.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> commands.getstatusoutput('cat /bin/junk')
(256, 'cat: /bin/junk: No such file or directory')
>>> commands.getstatusoutput('/bin/junk')
(256, 'sh: /bin/junk: not found')
>>> commands.getoutput('ls /bin/ls')
'/bin/ls'
>>> commands.getstatus('/bin/ls')
'-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls'

必要に応じてcommandsモジュールには3つの方法があります.getstatusoutput, getoutput, getstatus.しかし、上記の3つの方法はいずれもPythonが推奨する方法ではなく、Python 3のうち2つはすでに消えている.Pythonドキュメントでは現在、4つ目の方法を全力でお勧めしています.subprocess!
4つ目:subprocessは同じように簡単です.
>>> subprocess.call(["ls", "-l"],shell=True)
0
>>> subprocess.call("ls -l", shell=True)
0
>>> subprocess.call("exit 1", shell=True)
1

コマンドを直接呼び出し、戻り値はシステム戻りです.shell=Trueは、コマンドが最終的にshellで実行されることを示します.Pythonドキュメントでは、セキュリティ上の理由からshell=Trueは推奨されません.shellコマンドの代わりにPythonライブラリを使用するか、pipeのいくつかの機能を使用してエスケープすることをお勧めします.公式の出発点はいいですが、本当にご迷惑をおかけしました.so....
コマンドの端末出力にもっと注目すれば
>>> subprocess.check_output(["echo", "Hello World!"])
'Hello World!
'
>>> subprocess.check_output("exit 1", shell=True) Traceback (most recent call last): ... subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

同じように簡単です.
実はまだ2つの方法があります:os.spawn*とpopen 2.*です.同じ任務を果たすこともできますが、編集者は普段使ったことがないので、恥をかかせません.
原文:http://www.freelycode.com/contribution/detail/8