从PHP调用Python脚本时,控制台运行创建的临时文件在PHP调用时未创建

1 投票
3 回答
1922 浏览
提问于 2025-04-15 11:54

场景:

我有一个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 个回答

0

检查一下运行这个Python脚本的用户是否在当前工作目录(CWD)里有写权限。另外,可以试试用shell_exec()或者passthru()来调用这个脚本,而不是用system()。

1

可能是权限问题

如果Apache是以apache这个用户身份运行的,那么它就不能写入文件,除非满足以下条件:

  1. 这个文件的拥有者是apache
  2. 这个文件属于apache组,并且组权限是可写的
  3. 这个文件是对所有人可写的

在多用户的机器上,这个问题比较棘手,因为不同的人都可以访问Apache。

你可以试试在文件上运行chmod 666 output.txt,然后再重新测试一下。


一些考虑事项:

  1. 让Python脚本把输出写入数据库
  2. 使用PHP的popen功能来打开进程并通过管道进行通信
  3. 用PHP的正则表达式重写
  4. 把输出文件写到/tmp目录,然后在Python脚本完成后,立即用PHP读取结果。
  5. 等等...
2

我敢打赌你的Python脚本里有一些错误,导致它在从PHP里面调用的时候出问题。试试

passthru('/usr/python/bin/python3 ../cgi-bin/tabular.py 1 2>&1');

去查一下(注意2>&1,这个会把错误信息输出到正常的输出里)。

撰写回答