我试图从我的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()是最好的等待方式。
答案 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.Popen
和subprocess.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}}