我们可以在Python启动的同一命令提示符中执行多个命令吗
有一个Excel文件,里面记录了多个场景的路径。我在一个循环里使用了 os.system(command)
。每次循环时,从Excel文件中读取一个路径,然后执行这个路径对应的场景。
我的问题是,每次使用 os.system()
时,都会打开一个命令提示符(CMD),执行一个命令后又关闭。接着在下一次循环中,再读取第二个路径,执行它,然后CMD又关闭。这样CMD不断弹出,系统在这段时间内也忙着处理这些命令,无法做其他事情。我希望能在一个CMD窗口中执行所有的命令,这样我就可以最小化它,继续用系统做其他任务。
在每次循环中,有两个主要步骤:
os.chdir(PATH)
os.system(path of exe+" "+name of config file that is present at PATH")
能不能用subprocess来实现这个?如果可以的话,请给我一些示例,看看怎么实现。
3 个回答
要同时运行每个路径下的 config.ini
文件,并在执行之前将当前目录切换到 cwd
,可以使用 c:\path\to\exe
:
from subprocess import Popen
processes = [Popen([r"c:\path\to\exe", "config.ini"], cwd=path) for path in paths]
for p in processes: p.wait()
如果你不想同时运行所有命令,可以使用 subprocess.call()
,并且参数和 subprocess.Popen()
是一样的。
这件事是可以做到的——下面是一个使用多进程的简单例子(适用于Python 2.6或更新版本)。
下面的例子使用了一个Unix命令(“ls”)和Unix路径(“/usr, etc...”),你只需要把这些换成你需要的命令和路径就可以了。
from multiprocessing import Process
import os
paths = ["/tmp", "/usr", "/usr/include"]
def exec_(path):
p = Process()
p.run = lambda: os.system("ls %s" % path)
p.start()
for path in paths:
exec_(path)
还有一个选择,如果你需要对运行的内容、返回代码等有更复杂的控制,可以使用Fabric项目——虽然它主要是用来通过ssh在不同主机上执行多个命令,但我觉得也可以用来在同一主机上处理不同的路径。
Fabric的链接:
http://docs.fabfile.org/en/1.3.3/index.html
如果你想使用 subprocess 模块,可以试试下面这样的写法:
from subprocess import call
import os.path
def call_scenario(path, config_file):
retcode = call(["path/of/exe", os.path.join(path,config_file)])
if retcode != 0:
print "Something bad happened : %s"%retcode
在使用 subprocess.call 时,设置 shell=False
这个参数可以避免启动一个命令行窗口来执行操作。