3

我正在使用 python 从 .xlsm excel 文件中读取数据。我有两个几乎相同的文件并保存在同一目录中。当我给python程序一张excel表时,它会正确读取数据并解决问题。但是,使用其他 excel 表时,我收到以下错误。

(我用####屏蔽了我的名字)

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    solve("updated_excel.xlsm")
  File "C:\Documents and Settings\#####\My Documents\GlockNew.py", line 111, in solve
    prob.solve()
  File "C:\Python27\lib\site-packages\pulp-1.5.4-py2.7.egg\pulp\pulp.py", line 1614, in solve
    status = solver.actualSolve(self, **kwargs)
  File "C:\Python27\lib\site-packages\pulp-1.5.4-py2.7.egg\pulp\solvers.py", line 1276, in actualSolve
    return self.solve_CBC(lp, **kwargs)
  File "C:\Python27\lib\site-packages\pulp-1.5.4-py2.7.egg\pulp\solvers.py", line 1343, in solve_CBC
    raise PulpSolverError, "Pulp: Error while executing "+self.path
PulpSolverError: Pulp: Error while executing C:\Python27\lib\site-packages\pulp-1.5.4-py2.7.egg\pulp\solverdir\cbc.exe

我不知道“”Pulp:执行“+self.path”时出错是什么意思,但是两个文件都存储在同一个目录中,只有在我尝试解决问题时才会出现问题。有谁知道什么可能触发这样的错误?

编辑

经过进一步调试,发现错误出在COIN_CMD类中的solve_CBC方法上。错误发生在这里:

if not os.path.exists(tmpSol):
    raise PulpSolverError, "Pulp: Error while executing "+self.path

当我为两个 excel 工作表运行求解器时,它们的 tmpSol 值相同:4528-pulp.sol

但是,当我为一个 excel 表运行它时,os.path.exists(tmpSol) 返回 true,而另一个则返回 false。那 be- tmpSol 怎么可能两次都具有相同的值?

4

2 回答 2

1

该名称是使用进程 ID 创建的,如果您有某种批处理作业从一个进程启动两个求解器应用程序,那么它们将具有相同的名称。

于 2014-03-27T16:01:42.023 回答
0

我在启动 LP Solver 类的多个实例时遇到了同样的问题。该问题是由纸浆的solvers.py文件中的以下代码行引起的:

pid = os.getpid()
tmpLp = os.path.join(self.tmpDir, "%d-pulp.lp" % pid)
tmpMps = os.path.join(self.tmpDir, "%d-pulp.mps" % pid)
tmpSol = os.path.join(self.tmpDir, "%d-pulp.sol" % pid)

它出现在每个求解器中。问题是这些路径稍后会被删除,但对于 LPSolver 类的不同实例可能会重合(因为变量 pid 不是唯一的)。

解决方案是为每个 LPSolver 实例获取唯一路径,例如使用当前时间。用以下四行替换上面的行就可以了。

currentTime = time()
tmpLp = os.path.join(self.tmpDir, "%f3-pulp.lp" % currentTime)
tmpMps = os.path.join(self.tmpDir, "%f3-pulp.mps" % currentTime)
tmpSol = os.path.join(self.tmpDir, "%f3-pulp.sol" % currentTime)

不要忘记

from time import time

干杯,蒂姆

于 2017-03-27T12:59:41.470 回答