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

使用子流程,您有几个选择。最简单的是调用

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

shlex 获取字符串并将其拆分为一个列表,就像 shell 拆分它的方式一样。换句话说:

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

你也可以这样做:

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

但如果 meshlabString 不受信任,这种方式会带来安全风险。最终,subprocess.call它只是subprocess.Popen类的一个包装器,为方便起见而提供,但它具有您想要的功能。

于 2012-07-14T04:11:09.617 回答
1

你有两个选择,subprocess.Popensubprocess.call。主要区别在于默认情况下Popen是非阻塞的,而默认是call阻塞的。这意味着您可以Popen在其运行时与之交互,但不能与call. 您必须等待该过程完成call,您可以修改该过程以Popen使用相同的方式运行wait()

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 回答