Команда PHP exec () не запускает скрипт Python с использованием sendkeys - PullRequest
2 голосов
/ 11 сентября 2011

Первое примечание: Извините, это долго.Хотел быть тщательным.Я очень не хочу задавать вопрос, когда в Интернете так много всего, но это была неделя поиска, и мне нечего показать.Буду очень признателен за помощь.Я новичок, но я учусь очень быстро и более чем готов попробовать альтернативные языки или что-то еще.

Цель: Я пытаюсь создатьУдаленный Netflix (только для личного использования), который управляет Netflix на сервере (32-разрядный ПК с Windows 7) с помощью сочетаний клавиш (например, пробел, чтобы приостановить) после нажатия кнопки на странице php на моем ipod touch или телефоне Android.В настоящее время пульт ДУ использует USBUIRT для управления телевизором и ИК-устройствами без проблем.Если у вас есть какие-либо альтернативные методы (которые я могу построить, а не купить), чтобы предложить или другие языки, которые я мог бы изучить, которые могут достичь этого, я буду счастлив выучить.

Проблема: PHP-команды exec () и system () не будут запускать скрипт python (или exe-файл, скомпилированный с py2exe), который просто нажимает клавишу Windows (предназначенную для нажатия клавиши на сервере, а не на машине, загружающей страницу php).Я могу использовать UUTX.exe USBUIRT, передавая аргументы с 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 output Arraystring (9) "

Копирование всего содержимого exec () в командную строку работает правильно. Я попытался переместить файл в папку htdocs, изменил права доступа к папке и убедился, что это не такв safemode в 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");

Нет ошибок в error.log и событиизритель.Поместить его внутрь ob_start ();и получение результатов с помощью ob_get_clean ();не дает мне абсолютно ничего.Нет текста или что-либо вообще.Я попробовал намного больше, но я уже написал здесь роман, так что я просто должен ответить на остальное, как мы идем.Я опубликую полный исходный код php или скрипт python, если это необходимо, но все, что он делает, это импортирует sendkeys и нажимает клавишу Windows, чтобы открыть меню «Пуск» в качестве базового визуального теста.Я не знаю, есть ли у него разрешения, как работает моя установка, мое кодирование ... Я просто больше не знаю.И снова я прошу прощения за это так долго, и если вы ответите, я действительно ценю, что вы нашли время, чтобы прочитать все это, чтобы выручить совершенно незнакомого человека.

Ответы [ 2 ]

2 голосов
/ 11 сентября 2011

Сервер PHP, на котором выполняется сценарий, скорее всего, работает от имени другого пользователя (сетевой службы), нежели учетная запись, вошедшая в консоль GUI.Я думаю, что этот тип установки может работать под XP и / или с активным интерактивным полем в сервисе.Тем не менее, я считаю, что в Vista / 7 он заблокирован по соображениям безопасности .Детали немного размыты, так как я сейчас нахожусь перед Linux-системой.

Решением было бы запустить php вручную в сеансе, где запущен netflix, и повторить попытку.Если это не работает, я однажды написал простой клиент-сервер на python, который принимает ключевые команды и преобразует их в нажатия клавиш.Было довольно легко сделать.

0 голосов
/ 12 сентября 2011

Понял это благодаря отличной помощи от Уинстона Эверта и Гринго Суаве.

Я установил службу Apache для учетной записи локальной системы и дал ей доступ к рабочему столу. Это должно помочь, если у вас Windows XP или Server 2003, но в Vista и новее есть обнаружение интерактивных служб, которое появляется при попытке запуска приложений с графическим интерфейсом из php. Каждая команда выполнялась правильно, но делала это в сеансе 0. Это потому, что Apache был установлен как сервис. Для большинства людей я думаю, что переустановка без настройки Apache в качестве службы будет работать, но я все равно думал о переходе на XAMPP, поэтому необходимость удаления Apache помогла мне принять решение.

В конечном итоге все коды, которые я написал в своем первоначальном посте, теперь работают в результате, и мой проект может двигаться вперед. Я надеюсь, что кто-то еще наткнется на это и получит такую ​​же помощь от Уинстона Эверта и Гринго Суаве, как и я! Большое спасибо вам обоим!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...