使用shell_exec编写通过PHP调用的Python文本文件

时间:2018-07-16 11:57:19

标签: php python

所以首先,很抱歉,如果这个问题已经在其他地方得到回答,但是我自己找不到答案。

我有一个运行在Ubuntu 16.04的LAMP服务器,我正尝试使用Python 2.7.12从PHP写入文本文件。

我有以下两个文件(请注意,这两个文件位于同一目录中):

index.php

<?php
    $command = escapeshellcmd('python test.py a b c');
    $output = shell_exec($command);
    echo $output;
?>

test.py

import sys

print "argv1: ", sys.argv[1]
print "argv2: ", sys.argv[2]
print "argv3: ", sys.argv[3]

f = open("test-" + sys.argv[1] + ".txt","w+")
f.write("test")
f.close()

print "Text added."

当我在浏览器中导航到index.php文件时,得到以下输出:

argv1: a argv2: b argv3: c

但是,当我在终端中执行此代码时,将创建文件test-a.txt并得到以下输出:

layer8@alpha:/var/www/html/$ python test.py a b c
argv1:  a
argv2:  b
argv3:  c
Text added.

我似乎无法理解和弄清楚为什么Python文件在第三条argv3打印语句之后没有执行任何代码?

我对此进行了大量研究,但一直无法找到解决方案。如果您需要我的进一步信息,请随时询问;任何回应表示赞赏。

谢谢。

1 个答案:

答案 0 :(得分:1)

shell_exec仅将打印出的内容返回到stdout。如果Python脚本中出现异常,则整个异常消息和回溯都将打印在stderr上,因此它们不会成为输出的一部分。请注意,从理论上讲,shell_exec应该在发生错误时返回NULL,但这是PHP,因此如果内置函数的行为如文档所述,那就没什么好玩的了。

无论如何:问题很可能与打开文件有关,并且很可能是权限问题。

首先,您正在使用相对路径,并且相对路径是针对当前工作目录而不是针对脚本所在目录进行解析的,因此,如果您期望一个理智而可预测的行为,请始终使用绝对路径(将其作为参数传递或根据脚本的当前位置构建。)

此外,您的Apache服务器可能不会(与您所使用的环境相同)运行env和用户(这是一种轻描淡写的方式),因此,可能不允许该服务器打开要写入的文件,无论其当前工作目录是什么那时。

最后,即使是PYTHONPATH也可能与您的PYTHONPATH不同,因此它甚至可能正在执行另一个(剩余)test.py或陈旧的test.pyc文件。

总而言之:如果无法访问系统,就无法确定到底出了什么问题,但是至少现在您知道从哪里开始调试了。

我个人要做的第一件事是确保将python脚本中的任何错误都打印到stdout:

import sys

print "argv1: ", sys.argv[1]
print "argv2: ", sys.argv[2]
print "argv3: ", sys.argv[3]

try:
    fname = "test-%s.txt" % sys.argv[1]
    with open(fname,"w+") as f:
        f.write("test")

    print "Text added."
except Exception as e:
    print "oops : got %s" % e
    raise