Writing COIN-OR CBC Log File
I was unable to find an answer without changing the pulp
source code, but if that does not bother you, then take the following route:
navigate to the directory of your pulp install library and look at the solvers.py
file.
The function of interest is solve_CBC
in the COIN_CMD
class. In that method, the arguments are formed into a single command to pass to the cbc-64
solver program, it is then called using the subprocess.Popen
method. The stdout
argument for this method is either set to None
or os.devnull
neither of which is very useful for us. You can see the process call on line 1340 (for PuLP 1.5.6).
cbc = subprocess.Popen((self.path + cmds).split(), stdout = pipe,
stderr = pipe)
This source also reveals that the problem (mps) and solution (sol) files are written to the /tmp
directory (on UNIX machines) and that the file names include the pid
of the interpreter calling it. I open a file using this id and pass it to that argument. like this:
logFilename = os.path.join(self.tmpDir, "%d-cbc.log" % pid)
logFile = open(logFilename, 'a')
cbc = subprocess.Popen((self.path + cmds).split(), stdout = logFile,
stderr = pipe)
Sure enough, in the /tmp
directory I see my log files after running. You can set the verbosity with log N
see the cbc help for more documentation there. Since this creates a different file for each process id, I think it will solve your problem of running multiple solvers in parallel.