执行 python 脚本以从 PHP 发送短信时出错


Error while executing a python script to send SMS from PHP

Edit 实际上,使用配置文件的路径作为函数的参数可以解决问题

sm.ReadConfig(Filename="/home/myuser/.gammurc")

我正在使用 Python 的 Gammu 库。我的想法是创建一个可以发送短信的python脚本,以便以后从脚本PHP调用它。

这是 python 脚本的代码。

#!/usr/bin/env python
import gammu
import sys
sm = gammu.StateMachine()
sm.ReadConfig()
if len(sys.argv) != 3:
    print 'Uso: sms.py MENSAJE DESTINATARIO'
    sys.exit(1)
rawtext = sys.argv[1]
spttext = rawtext.split("*e*")
text = " ".join(spttext)
sm.Init()
message = {
    'Text': text,
    'SMSC': {'Location': 1},
    'Number': sys.argv[2],
}
if (sm.SendSMS(message)):
    print "OK"

如果我从终端使用此脚本可以正常工作,问题是当我使用 exec() 从 PHP 调用脚本时,我在运行 ReadConfig() 函数时从 Gammu 库收到错误:

gammu.ERR_CANTOPENFILE: {'Text': u'Can not open specified file.', 'Code': 28, 'Where': 'FindGammuRC via ReadConfig'}

我已经允许Web服务器使用gammu,运行命令"sudo adduser www-data dialout",但我不知道还有什么问题。

这是我从 PHP 调用脚本的方式:

$rcmd="python /home/my_user/Escritorio/pythonSMS/sms.py -V 2>&1";
exec($rcmd, $output);

我正在寻找任何帮助或建议,谢谢。

从您发布的错误来看,似乎在通过 PHP 执行它时,沿路径设置了目录权限或读取权限,阻止 PHP 用户(假设这是通过 Web 服务器执行的,如 apache)获取文件。

最简单的方法是像这样简单:

脚本 A:

#!/usr/bin/env python
file = open('/home/myuser/.gammurc' , r)
for line in file:
    print line

脚本 B:

<?php
    $cmd = '/path/to/script/A';
    exec($cmd);
?>

从理论上讲,这应该会产生类似的错误。如果是这种情况,请检查目录权限以及 .gmamurc 上的文件权限。如果这是通过Web服务器执行的,则可能需要对"myuser"具有755个权限,以便Web服务器能够遍历目录,然后读取文件,假设该文件具有644个权限。