ホームページ  >  記事  >  バックエンド開発  >  Python での Linux シェル コマンドの呼び出し

Python での Linux シェル コマンドの呼び出し

高洛峰
高洛峰オリジナル
2016-11-23 13:04:141432ブラウズ

ファイル システムのマウントなどの比較的単純な操作を完了するために、シェル コマンドを直接呼び出すことが避けられない場合があります。では、Python を使用して Linux シェル コマンドを呼び出すにはどうすればよいでしょうか?一般的に使用されるメソッドをいくつか示します:

1. os モジュール

1.1. os モジュールの exec メソッド ファミリ

Python の exec システム メソッドは、Unix の exec システム コールと一致しています。外部プログラムは現在のプロセスのコードを置き換えて戻らないため、これらのメソッドは子プロセスで外部プログラムを呼び出すのに適しています。 (ヘルプ(OS) -->検索「exec」関連の紹介を読んだのですが、使い方がよくわかりません)

1.2. OSモジュールのシステムメソッド

外部で実行する子プロセスを作成する プログラムとメソッドは、外部プログラムの実行結果のみを返します。この方法は、外部プログラムが結果を出力しない状況に適しています。

[python] view plaincopy

>>> import os

>>> os.system("echo "Hello World"") # os.system を直接使用して echo コマンドを呼び出す

Hello World ——————> コマンドの結果を表示します

0 ——————> これは何ですか?

>>> val = os.system("ls -al | grep "log" ") #戻り値を受け取るには val を使用します

-rw-r--r-- 1 root root 6030829 12 月 31 15: 14 log ————— & gt; このとき、コマンドの結果のみが出力されました

0 ————— & gt; ;>> val = os.system("ls -al | grep "log1" ")

>>> print val OS が結果を返さないコマンドを呼び出し、戻り値が次のようになります。 256~

>>>

注: 前述したように、このメソッドは外部プログラムの結果、つまり os.system の結果を保存するため、戻り値を受け取りたい場合は1.3. OS モジュールの Popen メソッド

このメソッドは、ファイルのようなオブジェクトを返し、 object read() または readlines() メソッドは出力コンテンツを読み取ることができます。たとえば、urllibを使用してWeb APIを呼び出す場合、取得したデータを処理する必要があります。 os.popen(cmd) コマンドの出力を取得するには、a=os.popen(cmd).read() のように read() または readlines() を呼び出すだけです


[python] view plaincopy

& gt; & gt; & gt; os.popen ('ls -lt')#OS.POPEN (CMD) を呼び出しても結果が得られません

& lt; モード ' & gt. ;

>>> print os.popen('ls -lt').read() # コマンドの結果を取得する

total 6064

-rwxr- xr-x 1 長い長い 23 1 月 5 日 21:00 hello.sh

-rw-r--r-- 1 長い 147 1 月 5 日 20:26 Makefile

drwxr-xr-x 3 長い長い 4096 1 月 2 日 19:37 テスト

-rw-r--r-- 1 ルート root 6030829 12 月 31 日 15:14 ログ

drwxr-xr-x 2 長い長い 4096 12 月 28 09:36 pip_build_long

drwx------ 2 Debian-gdm Debian-gdm 4096 12 月 23 日 19:08pulse-gylJ5EL24GU9

drwx------ 2 ロングロング 4096 1970 年 1 月 1 日 orbit-long

>>> val = os.popen('ls -lt').read() #変数を使用してコマンドの戻り値を受け取る

>>> if "log" in val:戻り値に文字列があります

... print "はは、ログがあります"

... else:

... print "いいえ、不満です"

...

はは、ログがあります



2. コマンド モジュール


はコマンド モジュールの getoutput メソッドを使用します。このメソッドと Popend の違いは、Popen がファイルのようなオブジェクトを返すことです。外部プログラムの出力は文字列として返されるため、多くの場合、この方が便利です。

主なメソッド:

* Commands.getstatusoutput(cmd) Return (ステータス、出力)

* Commands.getoutput(cmd) 出力結果のみを返す
* Commands.getstatus(file) Return ls -ld fileの実行結果文字列、getoutput が呼び出されます。このメソッドは推奨されません

[python] view plaincopy

long@zhouyl:/tmp/tests$ python

Python 2.7.3 (デフォルト、2013 年 1 月 2 日、16:53:07)

Linux2 の [GCC 4.7.2]

詳細については、「ヘルプ」、「著作権」、または「ライセンス」を入力してください

>>> . getstatusoutput('ls -lt') # Return (ステータス, 出力)

(0, 'total 5900n-rwxr-xr-x 1 long long 23 Jan 5 21:34 hello.shn-rw-r--r- - 1 長い長い 147 1 月 5 日 21:34 Makefilen-rw-r--r-- 1 長い長い 6030829 1 月 5 日 21:34 log')

>>> コマンド.getoutput('ls -lt') # コマンドの出力結果を返す(シェルコマンドの出力形式とは違うようです~)

'total 5900n-rwxr-xr-x 1 long long 23 Jan 5 21:34 hello.shn-rw- r--r-- 1 長い長い 147 1 月 5 日 21:34 Makefilen-rw-r--r-- 1 長い長い 6030829 1 月 5 日 21:34 log'

>>> コマンド.getstatus('log ') # コマンド mands.getoutput を呼び出します。 のコマンドは、'ログ' ファイルに対して同じ操作を実行します

'-rw-r--r-- 1 long long 6030829 Jan 5 21:34 log'

>> > . subprocess モジュール

公式 Python ドキュメントによると、subprocess モジュールは上記のモジュールを置き換えるために使用されます。 Python で実装された並列 ssh ツール (mssh) があります。コードは非常に短いですが、非常に興味深いものです。これは、スレッド内でサブプロセスを呼び出して、作業を実行します。


[Python] サブプロセスインポート呼び出しから plaincopy を表示

>>>

>>> call(["ls", "-l"])


システムと比較したサブプロセスの利点は、より柔軟であることです (標準出力、標準エラー、「実際の」ステータスを取得できる)コード、エラー処理の改善など)。 os.system の使用は廃止されるか、近いうちに廃止されると思います。

4. さまざまなメソッドの比較と概要

4.1. os.system について

os.system("some_command with args") は、コマンドとパラメーターをシステム シェルに渡します。複数のコマンドを同時に実行し、パイプと入力および出力のリダイレクトを設定する方法。例:
os.system("some_command < input_file | another_command > Output_file")
ただし、これは便利ですが、スペースなどのシェル文字のエスケープを手動で処理する必要があります。さらに、これにより実行できるのは単純なシェル コマンドのみであり、外部プログラムは実行できません。

4.2. os.popen について

stream = os.popen("some_command with args") を使用すると、os.system と同じことができます。os.system との違いは、os.popen が を返すことです。 class File オブジェクト。これを使用して標準入出力にアクセスします。

4.3. subprocess.popen について

subprocess モジュールの Popen クラスは os.popen の代替となることを目的としていますが、非常に包括的なため、os.popen よりも少し複雑です。
たとえば、print os.popen("echo Hello World").read() の代わりに print Popen("echo Hello World", stdout=PIPE, shell=True).stdout.read() を使用できます。しかし、それに比べれば、4 つの異なる Popen 関数を含む統一クラスを使用するのが良いでしょう。

4.4. subprocess.callについて

subprocessモジュールの呼び出し関数です。これは基本的に Popen クラスに似ており、同じパラメータを受け取りますが、単にコマンドが完了するのを待ってリターン コードを返します。例:
return_code = subprocess.call("echo Hello World", shell=True)


OS モジュールには C のような fork/exec/spawn 関数もありますが、それらを直接使用することはお勧めしません。サブプロセスの方が適しているかもしれません。


==============================================
[1] http://demi-panda.com/2013/01/25/python-shell-command/index.html
[2] http://m.blog.csdn.net/blog/overstack/9295995
[3] http://blog.csdn.net/swiftshow/article/details/7755543

以下は、記事に関係するコンテンツの公式 Python ドキュメントです:

[4] http://docs.python. org/library/subprocess .html#replacing-older-functions-with-the-subprocess-module -- subprocess を使用して古いメソッドを置き換えることについて

[5] http://docs.python.org/lib/os- process.html -- os exec メソッド ファミリとシステム メソッド

[6] http://docs.python.org/lib/os-newstreams.html -- os の Popen メソッド

[7] http: //docs.python.org/ lib/node528.html -- OS サブプロセスの紹介


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。