执行具有参数的Python程序并将结果用作PHP变量?(CodeIgniter、TextBlob、Python3.4、PHP7)

执行具有参数的Python程序并将结果用作PHP变量?(CodeIgniter、TextBlob、Python3.4、PHP7),php,python,codeigniter,python-3.x,php-7,Php,Python,Codeigniter,Python 3.x,Php 7,我有一个连接到数据库的PHP脚本。以下数组背后的思想是将这些信息插入数据库。类别需要由一个ML算法设置,我使用textblobforpython。我正在使用codeigniter PHP框架 $temp = $this->input->post('issue'); $data = array( 'priority' => '1', 'Summary' => $this->input->post('issue'), 'status' =>

我有一个连接到数据库的PHP脚本。以下数组背后的思想是将这些信息插入数据库。类别需要由一个ML算法设置,我使用textblobforpython。我正在使用codeigniter PHP框架

$temp = $this->input->post('issue');
$data = array(
   'priority' => '1',
   'Summary' => $this->input->post('issue'),
   'status' => 'Submitted',
   'category' => exec("python machineLearning.py .$temp"),
   'itemsRequired' => ' ',
   'lastUpdate' => date('Y-m-d G:i:s'),
   'ownerID' => $this->session->userdata('username'),
   'managerID' => 'tech'
);
python脚本(machineLearning.py)在单独调用时工作良好。我得到的错误是,该类别当前保留为空字符串。我尝试使用以下测试:

exec("python machineLearning.py idCard", $output);
print_r($output);
但结果只是一个空数组:

数组()

python程序在一个名为machineLearning的函数中包含机器学习,并接受一个名为issue的参数。我需要传递

$this->input->post('issue')
进入python程序中的machineLearning函数。我是否错误地传递了参数,或者exec()函数是否需要程序的正确路径?谢谢大家

找到解决方案

两个当前参数的组合解决了问题,我必须在exec()函数内更新文件路径,并更新exec function()的参数部分,但还必须使用建议的if语句。感谢两位的帮助

您的python脚本需要有一个“main”,用于从命令行读取参数并调用函数。比如:

if __name__ == "__main__": 
    YourFunction(sys.argv[1])
通过添加一些调试代码来打印参数。
关于可执行文件的路径,如果在php(您的服务器?)上下文中正确设置了路径环境以包含python的路径,则您不需要exe的完整路径。

看起来您可能有错误,因此无法从
exec
返回有效数据。尝试将
2>&1
添加到调用和调试输出中。例如,在本地,我尝试了一下,得到了:

exec("python machineLearning.py idCard 2>&1", $output);
print_r($output);


Array
(
    [0] => /usr/bin/python: can't open file 'machineLearning.py': [Errno 2] No such file or directory
)
您可能还希望在调用中对文件的绝对路径进行专门编码。这将解决上述“未找到文件”错误


我强烈建议在shell命令中使用用户输入之前对其进行转义/清理。现在有人可能发布恶意问题,如
;rm-Rf。
@Devon我听说过这一点,但目前正在努力实现这一点。不过,作为将来的参考,我该怎么做呢?php中有一个函数,escapeshellarg,应该很方便。回来有点耽搁,对此表示歉意,但您能解释一下
2>&1
部分吗?我环顾四周,有点明白,但不明白为什么有必要这样做?这叫做重定向。基本上,我允许您捕获来自Python脚本的所有消息,而不仅仅是STDOUT。
exec("python /path/to/machineLearning.py idCard 2>&1", $output);