我正在尝试使用Symfony Process从Laravel运行一个Ampl .run(或任何放大代码)文件。我的代码如下:
$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());
但我无法开始放大。我得到一个错误:
“”“”命令“'。/ AMP'”失败。\ 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访问终端程序,我认为这将非常有帮助。提前谢谢。
答案 0 :(得分:0)
我发现这里的问题是只需通过键入./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问题。