从PHP调用Python脚本时,控制台运行创建的临时文件在PHP调用时未创建
场景:
我有一个PHP页面,在这个页面里我调用了一个Python脚本。
当我在命令行(Linux)运行这个Python脚本时,它会在命令行上显示输出,同时也会把输出写入一个文件。
但是,当我通过PHP运行这个Python脚本时,它既没有在命令行上显示输出,也没有写入文件。
详细说明:
我在PHP中使用一个简单的系统命令来运行这个Python脚本,代码如下:
/var/www/html/1.php: system('/usr/python/bin/python3 ../cgi-bin/tabular.py 1');
/var/www/cgi-bin/tabular.py --这个Python文件主要是解析一个数据文件,使用Python的正则表达式来搜索特定的标题,并将这些标题输出到标准输出(stdout),同时也写入一个文件。
这个Python脚本里有几个例程会被执行,所以我加了打印语句来调试。我注意到在PHP页面上只看到了几个初始的打印输出,而那些实际执行某些操作的函数的输出却没有显示出来。
另外,作为我的测试的一部分,我想这个Python脚本在不同的文件夹里,干脆把它移动到/var/www/html文件夹试试,但还是不行。
我希望我把问题描述得足够详细,能有人在他们那边复现这个问题。如果我自己有任何进展,我会在这个问题上做注释。谢谢大家。
Gaurav
3 个回答
检查一下运行这个Python脚本的用户是否在当前工作目录(CWD)里有写权限。另外,可以试试用shell_exec()或者passthru()来调用这个脚本,而不是用system()。
可能是权限问题。
如果Apache是以apache
这个用户身份运行的,那么它就不能写入文件,除非满足以下条件:
- 这个文件的拥有者是
apache
- 这个文件属于
apache
组,并且组权限是可写的 - 这个文件是对所有人可写的
在多用户的机器上,这个问题比较棘手,因为不同的人都可以访问Apache。
你可以试试在文件上运行chmod 666 output.txt
,然后再重新测试一下。
一些考虑事项:
- 让Python脚本把输出写入数据库
- 使用PHP的popen功能来打开进程并通过管道进行通信
- 用PHP的正则表达式重写
- 把输出文件写到/tmp目录,然后在Python脚本完成后,立即用PHP读取结果。
- 等等...
我敢打赌你的Python脚本里有一些错误,导致它在从PHP里面调用的时候出问题。试试
passthru('/usr/python/bin/python3 ../cgi-bin/tabular.py 1 2>&1');
去查一下(注意2>&1,这个会把错误信息输出到正常的输出里)。