62

main.py プログラムから slave.py スクリプトを実行するために、非ブロック サブプロセス呼び出しを実行しようとしています。このslave.pyが一定期間実行されてから終了した後、subprocess.callを介してそれ(slave.py)が最初に開始されたときに、main.pyからslave.pyに引数を1回渡す必要があります。

main.py
for insert, (list) in enumerate(list, start =1):

    sys.args = [list]
    subprocess.call(["python", "slave.py", sys.args], shell = True)


{loop through program and do more stuff..}

そして私の奴隷スクリプト

slave.py
print sys.args
while True:
    {do stuff with args in loop till finished}
    time.sleep(30)

現在、slave.py は main.py が残りのタスクを実行するのをブロックしています。引数を渡した後、slave.py を main.py から独立させたいだけです。2 つのスクリプトが通信する必要はなくなりました。

非ブロック subprocess.call に関するネット上の投稿をいくつか見つけましたが、それらのほとんどは、現在必要のない時点で slave.py との通信を要求することに集中しています。これを簡単な方法で実装する方法を知っている人はいますか...?

4

3 に答える 3

67

subprocess.Popenの代わりに使用する必要がありsubprocess.callます。

何かのようなもの:

subprocess.Popen(["python", "slave.py"] + sys.argv[1:])

ドキュメントsubprocess.callから:

args で記述されたコマンドを実行します。コマンドが完了するのを待ってから、returncode 属性を返します。

(また、を使用する場合は、リストを使用して引数を渡さないでくださいshell = True)。


非ブロッキング suprocess 呼び出しを示すMCVE 1の例を次に示します。

import subprocess
import time

p = subprocess.Popen(['sleep', '5'])

while p.poll() is None:
    print('Still sleeping')
    time.sleep(1)

print('Not sleeping any longer.  Exited with returncode %d' % p.returncode)

コルーチン ベースの並列処理を可能にするために、Python 言語への最近の変更に依存する別のアプローチは次のとおりです。

# python3.5 required but could be modified to work with python3.4.
import asyncio

async def do_subprocess():
    print('Subprocess sleeping')
    proc = await asyncio.create_subprocess_exec('sleep', '5')
    returncode = await proc.wait()
    print('Subprocess done sleeping.  Return code = %d' % returncode)

async def sleep_report(number):
    for i in range(number + 1):
        print('Slept for %d seconds' % i)
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()

tasks = [
    asyncio.ensure_future(do_subprocess()),
    asyncio.ensure_future(sleep_report(5)),
]

loop.run_until_complete(asyncio.gather(*tasks))
loop.close()

1 python2.7 および python3.6 を使用して OS-X でテスト済み

于 2013-04-17T23:17:03.547 に答える