0

我正在尝试使用 Symfony Process 从 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 \n 退出代码: 2(滥用 shell builtins)\n \n 工作目录: /usr/local/bin/amplitude/amplide.linux64\n \ n 输出:\n ================\n \n \n 错误输出:\n ================\n """

我怀疑这是目录中的权限错误,但是当我使用时:

$commandArray = array('ls');

它工作并输出文件和文件夹的列表。我知道ampl基本上是一个终端程序,那么我如何访问和写入命令呢?

如果有人可以解释如何从 Process 访问终端程序,我认为这将非常有帮助。先感谢您。

4

1 回答 1

0

我发现这里的问题是仅通过键入调用 ampl 控制台./ampl不会触发任何响应。由于它不能被解释为一个实际的命令,Laravel 给出了一个错误。诀窍是将实际命令传递给进程对象,并始终提供您要引用的任何 .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 文件,则使用字符串连接将其传递给命令会导致问题,尽管我不完全知道为什么。我建议先使用 Laravel 中的 Storage 类更新 .dat 文件,然后使用 .run 文件运行 ampl 问题。

于 2018-04-27T20:27:21.877 回答