有一个excel文件,其中包含多个方案的路径。我在for循环中使用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")
可以通过使用子进程来完成。如果是,请举例说明如何实施?
答案 0 :(得分:2)
如果您想使用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
参数将避免启动cmd来执行某些操作。
答案 1 :(得分:0)
可以这样做 - 这是一个使用多处理(Python 2.6或更新版本)的快速示例
下面的示例使用Unix命令(“ls”)和unixes路径(“/ usr等...”),但只需用您需要的命令和路径替换它们。
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在不同的主机上执行多个命令 - 我认为它可以用于同一主机上的不同路径。
答案 2 :(得分:0)
同时为每个c:\path\to\exe
的所有config.ini
运行path
并在执行前将当前目录更改为cwd
:
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()
相同的参数。