【发布时间】:2013-06-14 18:46:04
【问题描述】:
我有一个 Python 脚本,它使用 urllib2 从外部站点检索数据。 我在需要代理身份验证的公司网络上。
在命令行上时,我可以在 .bashrc 中导出代理设置,以允许脚本通过代理退出并发出请求。
所以脚本确实在代理后面工作。
问题来了: 我需要从网站上的 php 脚本调用这个 Python 脚本。 我已经尝试了几种方法来通过调用脚本来实现这一点: exec()、popen()、shell_exec()
我无法让脚本返回任何结果。 拖尾时 /var/log/httpd/error** 我可以看到正在生成的错误:
urllib2.URLError: <urlopen error [Errno 110] Connection timed out>, referer:
这与我在 .bashrc 中设置代理之前收到的错误相同
我已将 suPHP 设置并配置为以特定用户身份运行脚本。 我还设置了所有文件,包括该用户拥有的 python 脚本,并调整了权限,尝试 +x 并且出于测试目的不安全地设置为 777。
我可以从网站的同一目录运行一个 php 脚本,并验证 Apache 是否在此用户下运行,只需简单:
echo exec('whoami');
我还可以使用相同的设置从同一个 PHP 页面执行一个简单的 Python 脚本,该设置只打印到标准输出,我可以将该值返回到网页,所以我知道我可以使用这种方法执行 Python 脚本。
在命令行中,我使用与运行 Apache 的用户相同的用户,并在该帐户中设置代理,但是从网页执行时脚本仍然无法正确执行,仍然仅适用于 CLI。
只是为了测试,我在 Python 脚本中添加了一行写入文件,目的是将数据写入我需要返回的文件,并认为我可以在之后读取该文件。 我注意到,文件的创建工作,但没有数据写入它,因为 urllib2 代码超时并且从不写入文件。
知道如何让我的 PHP 脚本执行这个需要代理访问的 Python 脚本吗?
我需要明确告诉 urllib2 使用代理吗? 我正在使用的 urllib2 例程是 Python 模块的一部分,该模块被编码为仅使用操作系统的代理设置,而且我知道它可以工作,因为我可以在 CLI 的 Apache 用户下执行它。
非常感谢任何帮助。
【问题讨论】: