1

Python コードから Windows コマンド ラインで繰り返し呼び出しを実行しようとしています。ディレクトリ内の罰金ごとに、コマンドを実行し、それが完了するまで待つ必要があります。

try:
    directoryListing = os.listdir(inputDirectory)
    for infile in directoryListing:
        meshlabString = #string to pass to command line
        os.system(meshlabString)

except WindowsError as winErr:
    print("Directory error: " + str((winErr)))

私はオンラインで読んでいますが、これを行うにはsubprocess.call()を使用するのが好ましい方法のようですが、subprocess.call()を介してcmd.exeを実行する方法がわかりません。現在は os.system() を使用して動作していますが、一度に多数のプロセスを実行しようとすると、処理が追いつかなくなり、停止します。Windowsコマンドラインでコマンドを実行する方法について、誰かが私に数行のコードを提供できれば、そして subprocess.wait() が待機する最良の方法である場合。

4

2 に答える 2

1

2つのオプションがsubprocess.Popenありsubprocess.callます。主な違いは、デフォルトPopenでは非ブロッキングであるのに対し、callはブロッキングであるということです。つまり、Popen実行中は操作できますが、。は操作できませんcall。プロセスがで完了するのを待つ必要があります。これは、を使用して同じ方法で実行するようにcall変更できます。Popenwait()

callソースPopenに示されているように、それ自体は単なるラッパーです。

def call(*popenargs, timeout=None, **kwargs):
    """Run command with arguments.  Wait for command to complete or
    timeout, then return the returncode attribute.

    The arguments are the same as for the Popen constructor.  Example:

    retcode = call(["ls", "-l"])
    """
    with Popen(*popenargs, **kwargs) as p:
        try:
            return p.wait(timeout=timeout)
        except:
            p.kill()
            p.wait()
            raise

使用call

import os
from subprocess import call
from shlex import split

try:
    directoryListing = os.listdir(inputDirectory)
    for infile in directoryListing:
        meshlabString = #string to pass to command line
        call(split(meshlabString)) # use split(str) to split string into args

except WindowsError as winErr:
    print("Directory error: " + str((winErr)))
于 2012-07-14T05:09:44.110 に答える
1

サブプロセスでは、いくつかのオプションがあります。最も簡単なのはcallです:

import shlex
return_code=subprocess.call(shlex.split(meshlabString))

shlex は文字列を受け取り、シェルが分割するのと同じ方法でそれをリストに分割します。言い換えると:

shlex.split("this 'is a string' with 5 parts") # ['this', 'is a string', 'with', '5', 'parts]

次のこともできます。

return_code=subprocess.call(meshlabString,shell=True)

ただし、me​​shlabString が信頼されていない場合、この方法はセキュリティ リスクになります。最終的にsubprocess.callは、利便性のために提供されるクラスの単なるラッパーsubprocess.Popenですが、ここで必要な機能を備えています。

于 2012-07-14T04:11:09.617 に答える