PHP exec()命令无法使用sendkeys启动Python脚本
第一点:抱歉内容有点长。我想尽量详细说明。 我真的不想在网上问问题,因为有很多资料可查,但我已经搜索了一周,还是没有找到答案。非常希望能得到一些帮助。我是个新手,但我学习很快,也愿意尝试其他语言或任何可能的解决方案。
目标: 我想做的是一个个人使用的Netflix遥控器,通过在我的iPod Touch或安卓手机上的PHP页面按下一个按钮,来控制Windows 7 32位电脑上的Netflix,使用键盘快捷键(例如:空格键暂停)。目前这个遥控器使用USBUIRT来控制电视和红外设备,没有问题。如果你有其他我可以自己动手做的方法,或者可以学习的其他语言,我很乐意去学。
问题: PHP的exec()和system()命令无法启动一个Python脚本(或者用py2exe编译的exe文件),这个脚本的作用是按下Windows键(目的是在服务器上按键,而不是在加载PHP页面的机器上)。我可以使用USBUIRT的UUTX.exe通过exec()传递参数来控制红外设备,但我的exe、py和pyw文件都无法工作。我甚至尝试调用一个批处理文件来启动Python脚本,但那个批处理文件也无法启动。页面刷新了,但没有显示任何错误。
尝试过的: 这是一个有效的代码:
$exec = exec("c:\\USBUIRT\\UUTX.exe -r3 -fC:\\USBUIRT\\Pronto.txt LED_Off", $results);
以下是一些无效的尝试:
$exec = exec("c:\\USBUIRT\\test.py", $results);
$exec = exec("python c:\\USBUIRT\\test.py", $results);
$exec = exec("C:\\python25\\python.exe c:\\USBUIRT\\test.py", $results);
我尝试过使用双反斜杠、正斜杠和双正斜杠。即使不把结果传给变量$exec,也没有区别。$result输出 Arraystring(9) "
把exec()里的所有内容复制到命令行中可以正常工作。我尝试把文件移动到htdocs文件夹,修改文件夹权限,并确保PHP没有在安全模式下运行。Var_dump返回:Array" 使用foreach循环没有从数组中得到任何信息。 我的Apache日志只显示:
[Sat Sep 10 19:54:09 2011] [error] [client 127.0.0.1] File does not exist: C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/announce
设置:Apache 2.2,Python 2.5,PHP 5.3。运行在Windows 7上,只在本地网络连接,没有VPN等。给每个相关文件夹(Python、htdocs、cmd.exe文件、usbuirt文件夹)都赋予了IUSR、管理员、用户和所有人完全控制,仅用于初步测试(之后我会收紧安全性)。PHP的安全模式也关闭了。
备注:我在另一个类似问题中看到的这段代码不起作用:
exec("ping google.com -n 1");
错误日志和事件查看器中没有错误。把它放在ob_start();里面,用ob_get_clean();获取结果时,什么都没有得到。没有文本或任何内容。我尝试了很多其他方法,但我已经写了很多,所以接下来的问题我会逐步回答。如果需要,我可以发布完整的PHP源代码或Python脚本,但它只是导入sendkeys并按下Windows键以打开开始菜单,作为基本的可视测试。我不知道是权限问题、我的设置方式、我的编码……我真的不知道了。再次抱歉内容这么长,如果你能回答,我非常感谢你花时间阅读这些内容来帮助一个陌生人。
2 个回答
我终于搞定了,感谢Winston Ewert和Gringo Suave的出色帮助。
我把Apache的服务设置为本地系统账户,并允许它与桌面互动。如果你使用的是Windows XP或Server 2003,这样做应该会有帮助。不过在Vista及更新版本中,当你尝试从php启动图形界面应用时,会出现一个“交互式服务检测”的提示。所有命令都能正常执行,但都是在会话0中运行。这是因为Apache是作为服务安装的。对大多数人来说,我觉得重新安装Apache而不把它设置为服务应该能解决问题,但我本来就考虑要转到XAMPP,所以卸载Apache也促使我做出了这个决定。
最终,我在最初帖子中写的所有代码现在都能正常工作了,我的项目也可以继续推进了。希望其他人也能看到这个信息,并像我一样从Winston Ewert和Gringo Suave那里得到帮助!非常感谢你们!
运行这个脚本的PHP服务器可能是以一个不同的用户身份在工作(比如说是网络服务用户),而不是你在图形界面上登录的那个账户。我觉得这种设置在XP系统下可能可以用,或者在服务的“交互式”选项开启的情况下也能行。不过,我认为在Vista和7系统中,这种做法因为安全原因是被禁止的。具体情况我记得不是很清楚,因为我现在是在用Linux系统。
一个解决办法是手动在运行Netflix的会话中启动PHP,然后再试一次。如果这样还不行,我之前用Python写过一个简单的客户端/服务器程序,可以把按键命令转换成键盘输入。这个做起来还挺简单的。