在Python中使用shell\u ex通过PHP写入文本文件

2024-04-19 23:48:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我在Ubuntu 16.04中运行了一个LAMP服务器,我正在尝试使用Python 2.7.12从PHP写入一个文本文件。你知道吗

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

索引.php

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

测试.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."

当我导航到索引.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文件没有执行任何超过第三个print argv3语句的代码?你知道吗

我对此做了很多研究,却一直找不到解决办法。如果您需要任何进一步的信息,请不要犹豫问我,任何答复都很感谢。你知道吗

谢谢。你知道吗


Tags: 文件textpytesttxtaddedoutputsys
1条回答
网友
1楼 · 发布于 2024-04-19 23:48:36

shell_exec只返回打印到stdout的get。如果Python脚本中出现异常,那么整个异常消息和回溯都会打印在stderr上,因此它们不会成为输出的一部分。请注意,理论上,如果发生错误,shell_exec应该返回NULL,但这是PHP,因此如果内置函数的行为如文档所示,则不会有多大乐趣。。。你知道吗

无论如何:问题很可能是打开文件的问题,也很可能是权限问题。你知道吗

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

另外,您的Apache服务器可能不会(这是一个轻描淡写的说法)使用与您相同的env和用户运行,因此可能只是不允许打开一个文件,以便在他自己的当前工作目录中进行编写。你知道吗

最后,即使它的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

相关问题 更多 >