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

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

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

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

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

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

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

DropMixはNFC対応のカードゲームで、基本的にはリミックスアーティストになります。現在、Amazonでは$ 30まで下がっており、これまでで最高の価格に匹敵します。ロックバンドで有名なHarmonixによって開発されたDropMixは、おそらく少し野心的すぎるように思われます。結局のところ、ほとんどの人は素晴らしいリズムを持っていませんが、ゲームは驚くほどうまく実行されます。

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

写真:APメアリーJ.ブライジは、間もなくハリウッドウォークオブフェイムのスターを獲得します。これは、メアリーJよりもハリウッドウォークオブフェイムのほうが正直なところ恩恵です。

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

画像:グラズ工科大学/ NataschaEiblがデザインしたロゴ。MeltdownとSpectreは、攻撃者がシステムメモリに保存されているあらゆる種類の情報にアクセスできるようにする2つの脆弱性に付けられた名前です。

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

日本人に襲われたときに真珠湾にいた97歳の第二次世界大戦のベテランが、ニューヨークのブルックリンから追い出されています。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language