外部コマンドを呼び出す方法は?

5089
freshWoWer 2008-09-18 15:35.

Pythonスクリプト内から外部コマンドを(UnixシェルまたはWindowsコマンドプロンプトで入力したかのように)どのように呼び出しますか?

30 answers

4886
David Cournapeau 2008-09-18 15:39.

標準ライブラリのサブプロセスモジュールを見てください。

import subprocess
subprocess.run(["ls", "-l"])

利点subprocess対は、systemそれは(あなたが得ることができ、より柔軟であることであるstdoutstderr「本物の」ステータスコード、より良いエラー処理、等...)。

公式ドキュメントは推奨していますsubprocess代替の上にモジュールをos.system()

このsubprocessモジュールは、新しいプロセスを生成してその結果を取得するためのより強力な機能を提供します。この関数を使用するよりも、そのモジュールを使用することをお勧めします[ os.system()]。

サブプロセスモジュールと交換古い関数内のセクションsubprocessのドキュメントは、いくつかの有用なレシピを有することができます。

3.5より前のバージョンのPythonの場合は、次を使用しますcall

import subprocess
subprocess.call(["ls", "-l"])
3054
Eli Courtwright 2008-09-19 03:11.

外部プログラムを呼び出す方法と、それぞれの長所と短所の概要は次のとおりです。

  1. os.system("some_command with args")コマンドと引数をシステムのシェルに渡します。この方法で実際に一度に複数のコマンドを実行し、パイプと入出力リダイレクトを設定できるので、これは素晴らしいことです。例えば:

    os.system("some_command < input_file | another_command > output_file")  
    

ただし、これは便利ですが、スペースなどのシェル文字のエスケープを手動で処理する必要があります。一方、これにより、実際には外部プログラムではなく、単なるシェルコマンドであるコマンドを実行することもできます。ドキュメントを参照してください。

  1. stream = os.popen("some_command with args")os.systemそのプロセスの標準入出力にアクセスするために使用できるファイルのようなオブジェクトを提供することを除いて、と同じことを行います。ポペンには他に3つのバリエーションがあり、すべてi / oの処理が少し異なります。すべてを文字列として渡すと、コマンドはシェルに渡されます。それらをリストとして渡すと、何もエスケープすることを心配する必要はありません。ドキュメントを参照してください。

  2. モジュールのPopenクラスsubprocess。これは代替として意図されてos.popenいますが、非常に包括的であるため、少し複雑になるという欠点があります。たとえば、次のように言います。

    print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()
    

    の代わりに:

    print os.popen("echo Hello World").read()
    

    しかし、4つの異なるpopen関数ではなく、1つの統合されたクラスにすべてのオプションがあると便利です。ドキュメントを参照してください。

  3. モジュールcallからの機能subprocess。これは基本的にPopenクラスと同じで、すべて同じ引数を取りますが、コマンドが完了するまで待機し、リターンコードを返します。例えば:

    return_code = subprocess.call("echo Hello World", shell=True)  
    

    ドキュメントを参照してください。

  4. Python 3.5以降を使用している場合は、新しいsubprocess.run関数を使用できます。これは、上記とよく似ていますが、さらに柔軟性がありCompletedProcess、コマンドの実行が終了するとオブジェクトを返します。

  5. osモジュールには、Cプログラムにあるすべてのfork / exec / spawn関数も含まれていますが、直接使用することはお勧めしません。

subprocessモジュールは、おそらくあなたが使用しているものでなければなりません。

最後に、シェルによって実行される最後のコマンドを文字列として渡すすべてのメソッドについて、それをエスケープする責任があることに注意してください。渡す文字列のいずれかの部分が完全に信頼できない場合、セキュリティに重大な影響があります。たとえば、ユーザーが文字列の一部または一部を入力している場合です。よくわからない場合は、定数を使用してこれらのメソッドのみを使用してください。影響のヒントを与えるために、このコードを検討してください。

print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()

そして、ユーザーが「私のママは私を愛していなかった&& rm -rf /」と入力すると、ファイルシステム全体が消去される可能性があると想像してください。

374
EmmEff 2008-09-19 08:20.

典型的な実装:

import subprocess

p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
    print line,
retval = p.wait()

stdoutパイプ内のデータを使用して、自由にやりたいことができます。実際、これらのパラメーター(stdout=およびstderr=)を省略するだけで、のように動作しますos.system()

240
newtover 2010-02-13 00:15.

子プロセスを呼び出し元のプロセスから切り離す(子プロセスをバックグラウンドで開始する)ためのヒント。

CGIスクリプトから長いタスクを開始するとします。つまり、子プロセスはCGIスクリプト実行プロセスよりも長く存続する必要があります。

サブプロセスモジュールのドキュメントの典型的な例は次のとおりです。

import subprocess
import sys

# Some code here

pid = subprocess.Popen([sys.executable, "longtask.py"]) # Call subprocess

# Some more code here

ここでの考え方は、longtask.pyが終了するまで「callsubprocess」の行で待機したくないということです。しかし、例の「ここにもう少しコード」という行の後に何が起こるかは明らかではありません。

私のターゲットプラットフォームはFreeBSDでしたが、開発はWindowsで行われたため、最初にWindowsで問題に直面しました。

Windows(Windows XP)では、longtask.pyが作業を終了するまで、親プロセスは終了しません。これは、CGIスクリプトに必要なものではありません。この問題はPythonに固有のものではありません。PHPコミュニティでは、問題は同じです。

解決策は、DETACHED_PROCESSプロセス作成フラグをWindowsAPIの基になるCreateProcess関数に渡すことです。pywin32をインストールした場合は、win32processモジュールからフラグをインポートできます。それ以外の場合は、自分でフラグを定義する必要があります。

DETACHED_PROCESS = 0x00000008

pid = subprocess.Popen([sys.executable, "longtask.py"],
                       creationflags=DETACHED_PROCESS).pid

/ * UPD 2015.10.27 @eryksunは、意味的に正しいフラグがCREATE_NEW_CONSOLE(0x00000010)であることに注意してください* /

FreeBSDには別の問題があります。親プロセスが終了すると、子プロセスも終了します。そして、それはCGIスクリプトにも必要なものではありません。いくつかの実験では、問題はsys.stdoutの共有にあるように思われることが示されました。そして、実用的な解決策は次のとおりでした。

pid = subprocess.Popen([sys.executable, "longtask.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

私は他のプラットフォームでコードをチェックしておらず、FreeBSDでの動作の理由を知りません。誰かが知っているなら、あなたの考えを共有してください。Pythonでバックグラウンドプロセスを開始する際のグーグルは、まだ光を当てていません。

163
nimish 2008-09-18 15:37.
import os
os.system("your command")

コマンドはクリーンアップされないため、これは危険であることに注意してください。'os'および 'sys'モジュールの関連ドキュメントをグーグルで検索するのはあなたに任せています。同様のことを行う関数(exec *とspawn *)がたくさんあります。

156
sirwart 2008-09-18 15:42.

os.systemの代わりにサブプロセスモジュールを使用することをお勧めします。これは、シェルエスケープを実行するため、はるかに安全だからです。

subprocess.call(['ping', 'localhost'])
150
Alexandra Franks 2008-09-18 15:37.
import os
cmd = 'ls -al'
os.system(cmd)

コマンドの結果を返したい場合は、を使用できますos.popen。ただし、これはバージョン2.6以降非推奨であり、他の回答で十分にカバーされているサブプロセスモジュールが優先されます。

104
Tom Fuller 2016-10-30 04:02.

Pythonで外部コマンドを呼び出すことができるさまざまなライブラリがたくさんあります。ライブラリごとに説明を行い、外部コマンドの呼び出し例を示しました。例として使用したコマンドはls -l(すべてのファイルを一覧表示する)です。私がリストしたライブラリのいずれかについて詳しく知りたい場合は、各ライブラリのドキュメントをリンクしてください。

出典:

  • サブプロセス: https://docs.python.org/3.5/library/subprocess.html
  • shlex: https://docs.python.org/3/library/shlex.html
  • os: https://docs.python.org/3.5/library/os.html
  • sh: https://amoffat.github.io/sh/
  • 鉛: https://plumbum.readthedocs.io/en/latest/
  • pexpect: https://pexpect.readthedocs.io/en/stable/
  • ファブリック: http://www.fabfile.org/
  • 使節: https://github.com/kennethreitz/envoy
  • コマンド: https://docs.python.org/2/library/commands.html

これらはすべてライブラリです。

うまくいけば、これはどのライブラリを使用するかを決定するのに役立つでしょう:)

サブプロセス

サブプロセスを使用すると、外部コマンドを呼び出して、それらを入力/出力/エラーパイプ(stdin、stdout、およびstderr)に接続できます。コマンドを実行するためのデフォルトの選択はサブプロセスですが、他のモジュールの方が優れている場合もあります。

subprocess.run(["ls", "-l"]) # Run command
subprocess.run(["ls", "-l"], stdout=subprocess.PIPE) # This will run the command and return any output
subprocess.run(shlex.split("ls -l")) # You can also use the shlex library to split the command

os

osは「オペレーティングシステムに依存する機能」に使用されます。os.systemおよびを使用して外部コマンドを呼び出すためにも使用できますos.popen(注:subprocess.popenもあります)。osは常にシェルを実行し、実行する必要がない、または使用方法がわからない人のための簡単な代替手段ですsubprocess.run

os.system("ls -l") # run command
os.popen("ls -l").read() # This will run the command and return any output

sh

shは、プログラムを関数であるかのように呼び出すことができるサブプロセスインターフェイスです。これは、コマンドを複数回実行する場合に役立ちます。

sh.ls("-l") # Run command normally
ls_cmd = sh.Command("ls") # Save command as a variable
ls_cmd() # Run command as if it were a function

plumbumは、「スクリプトのような」Pythonプログラム用のライブラリです。のように関数のようなプログラムを呼び出すことができますsh。Plumbumは、シェルなしでパイプラインを実行する場合に役立ちます。

ls_cmd = plumbum.local("ls -l") # get command
ls_cmd() # run command

期待する

pexpectを使用すると、子アプリケーションを生成し、それらを制御し、出力内のパターンを見つけることができます。これは、Unixでttyを期待するコマンドのサブプロセスに代わる優れた方法です。

pexpect.run("ls -l") # Run command as normal
child = pexpect.spawn('scp foo [email protected]:.') # Spawns child application
child.expect('Password:') # When this is the output
child.sendline('mypassword')

ファブリック

ファブリックはPython2.5および2.7ライブラリです。これにより、ローカルおよびリモートのシェルコマンドを実行できます。ファブリックは、セキュアシェル(SSH)でコマンドを実行するための簡単な代替手段です。

fabric.operations.local('ls -l') # Run command as normal
fabric.operations.local('ls -l', capture = True) # Run command and receive output

使節

使節は「人間のためのサブプロセス」として知られています。subprocessモジュールの便利なラッパーとして使用されます。

r = envoy.run("ls -l") # Run command
r.std_out # get output

コマンド

commandsのラッパー関数が含まれていますが、より良い代替手段であるos.popenため、Python3から削除されていsubprocessます。

編集はJFセバスティアンのコメントに基づいていました。

78
Jorge E. Cardona 2012-03-13 14:12.

私はいつも次のfabricようなものに使用します:

from fabric.operations import local
result = local('ls', capture=True)
print "Content:/n%s" % (result, )

しかし、これは良いツールのようです:sh(Pythonサブプロセスインターフェース)。

例を見てください:

from sh import vgdisplay
print vgdisplay()
print vgdisplay('-v')
print vgdisplay(v=True)
77
Honza Javorek 2013-04-12 07:17.

標準ライブラリを使用

サブプロセスモジュール(Python 3)を使用します。

import subprocess
subprocess.run(['ls', '-l'])

これが推奨される標準的な方法です。ただし、より複雑なタスク(パイプ、出力、入力など)は、作成および書き込みが面倒な場合があります。

Pythonバージョンに関する注意:Python 2をまだ使用している場合、subprocess.callは同様に機能します。

ProTipは:shlex.splitは、あなたがのためにコマンドを解析することができruncallおよびその他のsubprocess場合の関数は、あなたがしたくない(または、あなたがすることはできません!)のリストの形でそれらを提供します。

import shlex
import subprocess
subprocess.run(shlex.split('ls -l'))

外部依存関係あり

外部依存関係を気にしない場合は、plumbumを使用してください。

from plumbum.cmd import ifconfig
print(ifconfig['wlan0']())

最高のsubprocessラッパーです。クロスプラットフォームです。つまり、WindowsとUnixライクなシステムの両方で動作します。によってインストールしpip install plumbumます。

もう1つの人気のあるライブラリはshです:

from sh import ifconfig
print(ifconfig('wlan0'))

ただし、shWindowsのサポートが終了したため、以前ほど素晴らしいものではありません。によってインストールしpip install shます。

76
athanassis 2010-10-07 21:09.

「pexpect」Pythonライブラリも確認してください。

これにより、ssh、ftp、telnetなどの外部プログラム/コマンドのインタラクティブな制御が可能になります。次のように入力するだけです。

child = pexpect.spawn('ftp 192.168.0.24')

child.expect('(?i)name .*: ')

child.sendline('anonymous')

child.expect('(?i)password')
74
Facundo Casco 2011-04-29 10:29.

呼び出しているコマンドからの出力が必要な場合は、subprocess.check_output(Python 2.7以降)を使用できます。

>>> subprocess.check_output(["ls", "-l", "/dev/null"])
'crw-rw-rw- 1 root root 1, 3 Oct 18  2007 /dev/null\n'

シェルパラメータにも注意してください。

シェルがのTrue場合、指定されたコマンドはシェルを介して実行されます。これは、Pythonを主にほとんどのシステムシェルで提供する拡張制御フローに使用していて、シェルパイプ、ファイル名ワイルドカード、環境変数の拡張、ユーザーのホームへの〜の拡張などの他のシェル機能への便利なアクセスが必要な場合に役立ちます。ディレクトリ。パイソン自体は(特に、多くの貝殻のような機能の実装を提供することをしかし、ノートglobfnmatchos.walk()os.path.expandvars()os.path.expanduser()、およびshutil)。

58
Usman Khan 2012-10-28 19:14.

これが私のコマンドの実行方法です。このコードには、必要なものがすべて含まれています

from subprocess import Popen, PIPE
cmd = "ls -l ~/"
p = Popen(cmd , shell=True, stdout=PIPE, stderr=PIPE)
out, err = p.communicate()
print "Return code: ", p.returncode
print out.rstrip(), err.rstrip()
57
Joe 2012-11-16 07:13.

更新:

subprocess.run推奨されるアプローチではPython 3.5のようにあなたのコードは、以前のPythonのバージョンとの互換性を維持する必要がない場合。より一貫性があり、Envoyと同様の使いやすさを提供します。(ただし、配管はそれほど単純ではありません。方法については、この質問を参照してください。)

これがドキュメントからのいくつかの例です。

プロセスを実行します。

>>> subprocess.run(["ls", "-l"])  # Doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

失敗した実行で発生します:

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

出力のキャプチャ:

>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')

元の答え:

Envoyを試すことをお勧めします。これはサブプロセスのラッパーであり、古いモジュールと関数を置き換えることを目的としています。使節は人間のためのサブプロセスです。

READMEの使用例:

>>> r = envoy.run('git config', data='data to pipe in', timeout=2)

>>> r.status_code
129
>>> r.std_out
'usage: git config [options]'
>>> r.std_err
''

パイプもあります:

>>> r = envoy.run('uptime | pbcopy')

>>> r.command
'pbcopy'
>>> r.status_code
0

>>> r.history
[<Response 'uptime'>]
47
Ben Hoffstein 2008-09-18 15:43.

サブプロセスを使用します。

...または非常に単純なコマンドの場合:

import os
os.system('cat testfile')
38
Aaron Hall 2017-10-19 06:37.

Pythonで外部コマンドを呼び出す

単純でsubprocess.runCompletedProcessオブジェクトを返すを使用します。

>>> import subprocess
>>> completed_process = subprocess.run('python --version')
Python 3.6.1 :: Anaconda 4.4.0 (64-bit)
>>> completed_process
CompletedProcess(args='python --version', returncode=0)

どうして?

Python 3.5以降、ドキュメントではsubprocess.runを推奨しています。

サブプロセスを呼び出すための推奨されるアプローチは、処理できるすべてのユースケースにrun()関数を使用することです。より高度なユースケースでは、基盤となるPopenインターフェースを直接使用できます。

考えられる最も単純な使用法の例を次に示します。これは、求められたとおりに実行されます。

>>> import subprocess
>>> completed_process = subprocess.run('python --version')
Python 3.6.1 :: Anaconda 4.4.0 (64-bit)
>>> completed_process
CompletedProcess(args='python --version', returncode=0)

runコマンドが正常に終了するのを待ってから、CompletedProcessオブジェクトを返します。代わりに、TimeoutExpiredtimeout=引数を指定した場合)またはCalledProcessError(失敗して合格した場合)を発生させる場合がありますcheck=True

上記の例から推測できるように、stdoutとstderrは両方とも、デフォルトで独自のstdoutとstderrにパイプされます。

返されたオブジェクトを調べて、指定されたコマンドとリターンコードを確認できます。

>>> completed_process.args
'python --version'
>>> completed_process.returncode
0

出力のキャプチャ

出力をキャプチャする場合はsubprocess.PIPE、適切なstderrまたはstdout:に渡すことができます。

>>> cp = subprocess.run('python --version', 
                        stderr=subprocess.PIPE, 
                        stdout=subprocess.PIPE)
>>> cp.stderr
b'Python 3.6.1 :: Anaconda 4.4.0 (64-bit)\r\n'
>>> cp.stdout
b''

(バージョン情報がstdoutではなくstderrに配置されるのは面白く、少し直感に反します。)

コマンドリストを渡す

コマンド文字列を手動で提供すること(質問が示唆するように)から、プログラムで作成された文字列を提供することへと簡単に移行できます。プログラムで文字列を作成しないでください。これは潜在的なセキュリティの問題です。入力を信頼していないと想定することをお勧めします。

>>> import textwrap
>>> args = ['python', textwrap.__file__]
>>> cp = subprocess.run(args, stdout=subprocess.PIPE)
>>> cp.stdout
b'Hello there.\r\n  This is indented.\r\n'

注意してください、args位置的にのみ渡されるべきです。

完全な署名

ソース内の実際の署名はhelp(run)次のとおりです。

def run(*popenargs, input=None, timeout=None, check=False, **kwargs):

popenargskwargsに与えられるPopenコンストラクタ。サブプロセスのstdinにパイプされるinputバイトの文字列(またはencodingまたはを指定する場合はUnicode universal_newlines=True)にすることができます。

ドキュメントにはtimeout=check=True私が説明できるよりも優れた説明があります。

タイムアウト引数はPopen.communicate()に渡されます。タイムアウトが経過すると、子プロセスは強制終了されて待機します。子プロセスが終了した後、TimeoutExpired例外が再発生します。

チェックがtrueで、プロセスがゼロ以外の終了コードで終了する場合、CalledProcessError例外が発生します。その例外の属性は、引数、終了コード、およびキャプチャされた場合はstdoutとstderrを保持します。

この例check=Trueは、私が思いついた例よりも優れています。

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

拡張された署名

ドキュメントに記載されているように、拡張された署名は次のとおりです。

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, 
shell=False, cwd=None, timeout=None, check=False, encoding=None, 
errors=None)

これは、argsリストのみを位置的に渡す必要があることを示していることに注意してください。したがって、残りの引数をキーワード引数として渡します。

ポペン

Popen代わりに使用する場合は?引数だけに基づいてユースケースを見つけるのに苦労します。Popenただし、wouldを直接使用するとpoll、「send_signal」、「terminate」、「wait」などのメソッドにアクセスできます。

これがソースでPopen与えられた署名です。これは(ではなくhelp(Popen))情報の最も正確なカプセル化だと思います。

def __init__(self, args, bufsize=-1, executable=None,
             stdin=None, stdout=None, stderr=None,
             preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,
             shell=False, cwd=None, env=None, universal_newlines=False,
             startupinfo=None, creationflags=0,
             restore_signals=True, start_new_session=False,
             pass_fds=(), *, encoding=None, errors=None):

しかし、より有益であるドキュメントは:Popen

subprocess.Popen(args, bufsize=-1, executable=None, stdin=None,
                 stdout=None, stderr=None, preexec_fn=None, close_fds=True,
                 shell=False, cwd=None, env=None, universal_newlines=False,
                 startupinfo=None, creationflags=0, restore_signals=True,
                 start_new_session=False, pass_fds=(), *, encoding=None, errors=None)

新しいプロセスで子プログラムを実行します。POSIXでは、クラスはos.execvp()のような動作を使用して子プログラムを実行します。Windowsでは、クラスはWindows CreateProcess()関数を使用します。Popenに対する議論は次のとおりです。

の残りのドキュメントを理解Popenすることは、読者の練習問題として残されます。

37
Martin W 2008-09-18 15:53.

os.system大丈夫ですが、ちょっと時代遅れです。また、あまり安全ではありません。代わりに、を試してくださいsubprocesssubprocessshを直接呼び出さないため、os.system。よりも安全です。

詳細については、こちらをご覧ください。

34
stuckintheshuck 2014-10-11 07:41.

Plumbumもあります

>>> from plumbum import local
>>> ls = local["ls"]
>>> ls
LocalCommand(<LocalPath /bin/ls>)
>>> ls()
u'build.py\ndist\ndocs\nLICENSE\nplumbum\nREADME.rst\nsetup.py\ntests\ntodo.txt\n'
>>> notepad = local["c:\\windows\\notepad.exe"]
>>> notepad()                                   # Notepad window pops up
u''                                             # Notepad window is closed by user, command returns
29
Samadi Salahedine 2018-05-01 03:47.

これは単純なことです。

import os
cmd = "your command"
os.system(cmd)
28
Priyankara 2015-06-30 01:34.

使用する:

import os

cmd = 'ls -al'

os.system(cmd)

os-このモジュールは、オペレーティングシステムに依存する機能を使用するポータブルな方法を提供します。

その他のos機能については、こちらのドキュメントをご覧ください。

27
mdwhatcott 2012-08-14 08:36.

私はその単純さのためにshell_commandがとても好きです。これは、サブプロセスモジュールの上に構築されています。

ドキュメントの例を次に示します。

>>> from shell_command import shell_call
>>> shell_call("ls *.py")
setup.py  shell_command.py  test_shell_command.py
0
>>> shell_call("ls -l *.py")
-rw-r--r-- 1 ncoghlan ncoghlan  391 2011-12-11 12:07 setup.py
-rw-r--r-- 1 ncoghlan ncoghlan 7855 2011-12-11 16:16 shell_command.py
-rwxr-xr-x 1 ncoghlan ncoghlan 8463 2011-12-11 16:17 test_shell_command.py
0
24
Atinc Delican 2010-01-09 11:11.

ここには、前述されていない別の違いがあります。

subprocess.Popen<command>をサブプロセスとして実行します。私の場合、別のプログラム<b>と通信する必要があるファイル<a>を実行する必要があります。

サブプロセスを試しましたが、実行に成功しました。ただし、<b>は<a>と通信できませんでした。ターミナルから両方を実行すると、すべてが正常です。

もう1つ:(注:kwriteは他のアプリケーションとは動作が異なります。Firefoxで以下を試してみると、結果は同じではありません。)

しようとするとos.system("kwrite")、ユーザーがkwriteを閉じるまで、プログラムフローがフリーズします。それを克服するために、私は代わりに試しましたos.system(konsole -e kwrite)。今回はプログラムが流れ続けましたが、kwriteがコンソールのサブプロセスになりました。

サブプロセスではなく、誰でもkwriteを実行します(つまり、システムモニターでは、ツリーの左端に表示される必要があります)。

24
Saurabh Bangad 2012-06-12 12:28.

os.system結果を保存することはできないので、結果をリストなどに保存したい場合は、うまくいきますsubprocess.call

22
cdunn2001 2011-01-19 09:21.

subprocess.check_call戻り値をテストしたくない場合に便利です。エラーが発生すると例外がスローされます。

22
Emil Stenström 2014-05-01 04:37.

私はshlexと一緒にサブプロセスを使用する傾向があります(引用符で囲まれた文字列のエスケープを処理するため):

>>> import subprocess, shlex
>>> command = 'ls -l "/your/path/with spaces/"'
>>> call_params = shlex.split(command)
>>> print call_params
["ls", "-l", "/your/path/with spaces/"]
>>> subprocess.call(call_params)
17
houqp 2014-05-02 10:49.

恥知らずなプラグ、私はこのためのライブラリを書きました:P https://github.com/houqp/shell.py

今のところ、これは基本的にpopenとshlexのラッパーです。また、Pythonでコマンドを簡単にチェーンできるように、パイピングコマンドもサポートしています。したがって、次のようなことができます。

ex('echo hello shell.py') | "awk '{print $2}'"
17
Swadhikar 2016-06-17 23:14.

Windowsではあなただけインポートすることができsubprocess、モジュールをして呼び出すことで外部コマンドを実行しsubprocess.Popen()subprocess.Popen().communicate()そしてsubprocess.Popen().wait()以下のように:

# Python script to run a command line
import subprocess

def execute(cmd):
    """
        Purpose  : To execute a command and return exit status
        Argument : cmd - command to execute
        Return   : exit_code
    """
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (result, error) = process.communicate()

    rc = process.wait()

    if rc != 0:
        print "Error: failed to execute command:", cmd
        print error
    return result
# def

command = "tasklist | grep python"
print "This process detail: \n", execute(command)

出力:

This process detail:
python.exe                     604 RDP-Tcp#0                  4      5,660 K
16
admire 2012-07-17 05:16.

Popenを使用して、プロシージャのステータスを確認できます。

from subprocess import Popen

proc = Popen(['ls', '-l'])
if proc.poll() is None:
    proc.kill()

subprocess.Popenをチェックしてください。

16
IRSHAD 2016-07-20 23:50.

OpenStack NeutronからネットワークIDを取得するには:

#!/usr/bin/python
import os
netid = "nova net-list | awk '/ External / { print $2 }'"
temp = os.popen(netid).read()  /* Here temp also contains new line (\n) */
networkId = temp.rstrip()
print(networkId)

novaネットリストの出力

+--------------------------------------+------------+------+
| ID                                   | Label      | CIDR |
+--------------------------------------+------------+------+
| 431c9014-5b5d-4b51-a357-66020ffbb123 | test1      | None |
| 27a74fcd-37c0-4789-9414-9531b7e3f126 | External   | None |
| 5a2712e9-70dc-4b0e-9281-17e02f4684c9 | management | None |
| 7aa697f5-0e60-4c15-b4cc-9cb659698512 | Internal   | None |
+--------------------------------------+------------+------+

print(networkId)の出力

27a74fcd-37c0-4789-9414-9531b7e3f126
15
Yuval Atzmon 2016-11-27 14:15.

Linuxでは、独立して実行される(pythonスクリプトが終了した後も実行を継続する)外部コマンドを呼び出したい場合は、タスクスプーラーまたはatコマンドとして単純なキューを使用できます。

タスクスプーラの例:

import os
os.system('ts <your-command>')

タスクスプーラに関する注意(ts):

  1. 実行する並行プロセス(「スロット」)の数は、次のように設定できます。

    ts -S <number-of-slots>

  2. インストールにtsは管理者権限は必要ありません。簡単な方法makeでソースからダウンロードしてコンパイルし、パスに追加すれば完了です。

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

2021 年 6 月 8 日にニューヨーク市で開催された covid-19 パンデミックで亡くなった人々の命を偲び、祝うために、ネーミング ザ ロスト メモリアルズが主催するイベントと行進の最中に、グリーンウッド墓地の正門から記念碑がぶら下がっています。週末、ジョー・バイデン大統領は、covid-19 パンデミックの終息を宣言しました。これは、過去 2 年以上にわたり、公の場でそうするための長い列の中で最新のものです。

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

オハイオ州のエミリー・デシャネル みんな早く来て、ボーンズが帰ってきた!まあ、ショーボーンズではなく、彼女を演じた俳優. エミリー・デシャネルに最後に会ってからしばらく経ちました.Emily Deschanel は、長期にわたるプロシージャルな Bones の Temperance “Bones” Brennan としてよく知られています。

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

どうやら、ドナルド・トランプに近い人々は、今月初めにFBIによって家宅捜索された彼のMar-a-Lago財産からの映像を公開するよう彼に勧めています. 前大統領はテープを公開するかどうかを確認していませんが、息子はフォックス・ニュースにそうなるだろうと語った.

Andor は、他の Star Wars ショーから大きな距離を置きます。

Andor は、他の Star Wars ショーから大きな距離を置きます。

アンドールの一場面。数十年前、ジョージ・ルーカスがスター・ウォーズのテレビ番組を制作するのを妨げた主な理由は、お金でした。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language