python リダイレクト - subprocess.popenとsubprocess.runの違いは何ですか




run関数 対話 (2)

Python 3.5では、 subprocess.Popen単純化してsubprocess.Popen簡略化するため subprocess.run が追加されました。コマンドを実行してそれが終了するまで待つ場合は、その間は何もしたくありません。 他の場合には、まだsubprocess.Popenを使用する必要があります。

主な違いは、 subprocess.runはコマンドを実行し、それが完了するのを待つことです。一方、 subprocess.Popenを使用すると、プロセスが終了しても作業を続行できます。 。

subprocess.runが実際に実行しているのはPopencommunicateを呼び出すことなので、データを送受信するためのループを作成したり、プロセスが終了するのを待つ必要はありません。

subprocess.run PopenパラメータがPopen渡され、どれがcommunicateするPopenの情報については、 このサイトをチェックしてください。

私はsubprocessモジュールに不慣れです、そして、ducumentationはsubprocess.popensubprocess.run間の違いが何であるか疑問に思います。 コマンドの動作に違いはありますか? ただ新しいの? どちらを使うのが良いですか?


All great answers, however a bit difficult for newbies.

I assume you have learned the return statement.

As an analogy, return and yield are twins. return means 'return and stop' whereas 'yield` means 'return, but continue'

  1. Try to get a num_list with return .
def num_list(n):
    for i in range(n):
        return i

それを実行します:

In [5]: num_list(3)
Out[5]: 0

See, you get only a single number rather than a list of them. return never allows you prevail happily, just implements once and quit.

  1. There comes yield

Replace return with yield :

In [10]: def num_list(n):
    ...:     for i in range(n):
    ...:         yield i
    ...:

In [11]: num_list(3)
Out[11]: <generator object num_list at 0x10327c990>

In [12]: list(num_list(3))
Out[12]: [0, 1, 2]

Now, you win to get all the numbers.

Comparing to return which runs once and stops, yield runs times you planed. You can interpret return as return one of them , and yield as return all of them . This is called iterable .

  1. One more step we can rewrite yield statement with return
In [15]: def num_list(n):
    ...:     result = []
    ...:     for i in range(n):
    ...:         result.append(i)
    ...:     return result

In [16]: num_list(3)
Out[16]: [0, 1, 2]

It's the core about yield .

The difference between a list return outputs and the object yield output is:

You will always get [0, 1, 2] from a list object but only could retrieve them from 'the object yield output' once. So, it has a new name generator object as displayed in Out[11]: <generator object num_list at 0x10327c990> .

In conclusion, as a metaphor to grok it:

  • return and yield are twins
  • list and generator are twins




python