我正在尝试使用Symfony进程从Laravel运行一个ampl .run (或任何ampl代码)文件。我的代码如下:
$commandArray = array('./ampl');
$process = new Process($commandArray);
$process->setWorkingDirectory('/usr/local/bin/amplitude/amplide.linux64');
$process->run();
if (!$process->isSuccessful())
{
throw new ProcessFailedException($process);
}
dd($process->getOutput());但我不能启动ampl。我犯了一个错误,比如:
“”命令"'./ampl'“失败。\n退出代码:2(错误使用shell内置程序) \n \n工作目录:/usr/local/bin/放幅.local 64 \n输出:\n ================\n \n错误输出:\n ================\n”“
我怀疑这是目录中的权限错误,但当我使用:
$commandArray = array('ls');它工作并输出文件和文件夹的列表。我知道ampl基本上是一个终端程序,那么我如何访问和写命令到它呢?
如果有人能解释如何从进程访问终端程序,我认为这将是非常有帮助的。提前谢谢你。
发布于 2018-04-27 20:27:21
我发现这里的问题是,只通过输入./ampl调用ampl控制台并不会触发任何响应。由于不能将其解释为实际命令,Laravel给出了一个错误。诀窍是将一个实际的命令传递给process对象和,以便始终为您正在复制的任何..run/..mod/ .dat文件提供完整的路径。例如:
$commandArray = array('./ampl path/to/example.run;');或
$command = './ampl path/to/example.run';工作正常,并会给出响应。
我注意到的另一件重要的事情是,由于AMPL基本上是在终端中运行的另一个程序,所以我们不能使用数组单独传递不同的命令,如下所示:
$commandArray = array('./ampl model.mod;','./ampl data.dat;', './ampl solve;');这不管用。这一点也不会:
$commandArray = array('./ampl, model.mod; data.dat; solve;');理想情况下,最好将所有内容保存在.run文件中,然后执行它。
如果您需要从Laravel将参数传递给.dat文件,那么使用string级联将参数传递到命令中会引起问题,尽管我不知道原因。我建议首先使用Laravel中的Storage更新.dat文件,然后使用.run文件运行ampl问题。
https://stackoverflow.com/questions/50043249
复制相似问题