process.call和cmd.exe

时间:2012-07-14 04:04:45

标签: python subprocess cmd

我试图从我的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()是最好的等待方式。

2 个答案:

答案 0 :(得分:1)

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

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类的包装器,为方便起见而提供,但它具有您想要的功能。

答案 1 :(得分: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 的封套,如source所示:

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)))

{{1}}