[英]call python script from PHP script
我需要从PHP脚本调用python脚本,然后将结果返回给PHP。 我在玩proc_open
函数。 但这行不通。 你知道为什么吗? 这是PHP脚本:
$msg = "this is a new message \n bla ble !@#$%^&*%(*))(_+=-";
$descriptorspec = array(
0 => array("pipe","r"),
1 => array("pipe","w"),
2 => array("file","./error.log","a")
) ;
$cwd = './' ;
$command = 'python ./upper.py ';
$proc = proc_open($command, $descriptorspec, $pipes, $cwd) ;
if ( is_resource( $proc ) ) {
fwrite( $pipes[0], $msg );
fclose( $pipes[0] );
fclose( $pipes[1] );
proc_close($proc);
echo "proc is closed\n";
}
else {
echo 'proc is not a resource';
}
python`upper.py'脚本
import sys
print 'in python script'
data = sys.stdin.readlines()
print data
输出为:
in php script
proc is closed
我在error.log中有错误:
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
以防万一答案仍然对任何人都重要:
发生错误是因为在python脚本有机会编写$pipes[1]
之前立即关闭它,而且很有可能甚至在它甚至开始运行之前就将其关闭。 我的系统(苹果机)上的错误是:
close failed: [Errno 32] Broken pipe
(出于好奇,您运行的是哪种类型的系统会给您带来奇怪的信息?)
无论如何,您可以通过在关闭管道之前读取管道来避免错误,例如,
stream_get_contents($pipes[1]);
这样可以确保在管道仍处于打开状态时,python脚本有机会编写管道(至少一次)。
如果您是python脚本的作者,那么除非您的PHP脚本要读取其编写的内容,否则让它编写输出没有什么意义。
在另一方面,如果Python脚本是你制作的不是,并把它写到你不在乎输出,你可能能够避免玩一些游戏与读取输出pcntl_wait()
或pcntl_waitpid()
- -虽然我不敢打赌。 一个更安全的选择可能是只读取输出流并将它们放在地板上。
(种类繁多的问题引发了一个有趣的问题,即您是否关心输出:如果您不知道先验 ,输出的结束会是什么样子,并且子proc_close()
在关闭管道并调用proc_close()
之前不会退出。 proc_close()
,您如何知道子流程实际上何时完成了您所称的工作?)
另一个选择(到目前为止,我还没有研究过)可能是将不需要的任何输出流连接到一个描述符,例如:
array("file", "/dev/null", "w")
或系统上与/dev/null
等价的任何东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.