2015-04-02 2 views
1

я Ubuntu пользователь .. У меня есть команда в PHP, который запускает файл питон .. файл питон установлен на исполняемый файл .. так, моя команда РНР: -Застрял в os.rename()

shell_exec("try.py"); 

файл питон находится на рабочем столе .. но файл PHP находится в папке WWW ..

/var/www/try.php 

в try.py, у меня есть код, чтобы переименовать файл на рабочем столе, как следующие: -

print "enter" 
os.rename("a.txt", "b.txt") 
print "exit" 

Итак, try.py и a.txt находятся на рабочем столе.

Моя проблема в том, что когда я выполняю файл php, он показывает только «enter», но не с «exit» .. поэтому i угадать, что он не может выполнить os.rename, возможно, из-за привилегии root или чего-то, что я не знаю .. Я пробовал некоторые решения для отключения пароля для sudo, но все же я не показывал «выход».

, но, если я выполнить try.py непосредственно дважды щелкните по нему на рабочем столе и запустить его, то команда может быть сделано, и выход шоу: -

enter 
exit 

так, кто знает, как выполнить он использует php?

+0

Может быть, вместо того, чтобы пытаться 'os.rename' для целей тестирования попробовать что-то вроде' печати «% S»% зева. listdir (os.getcwd()) 'и посмотреть, выходит ли он. –

ответ

1

наконец, я получил решение ..

, чтобы иметь возможность переименовать файл в рабочем столе с помощью os.rename, нам нужно изменить некоторые из конфигураций в sudoers ..

он участвует несколько шагов в visudo, а также скрипт PHP ..

в visudo (с помощью команды "Суда visudo" в терминале:) -

#user privilege specification 
root All=(ALL:ALL) ALL 
www-data ALL=(ALL:ALL) ALL 

#includedir /etc/sudoers.d 

ubuntu ALL=(ALL) NOPASSWD: ALL //use your username.. mine is ubuntu 
www-data ALL=(ALL) NOPASSWD: ALL //the place where i put the php file 

в PHP файле: -

<?php 
$output = exec("sudo python /home/ubuntu/Desktop/[filename.py]"); 
?> 

для питона файла точно такой же ..

os.rename("a.txt", "b.txt") 

нормально .. это решение .. Теперь я могу запустить питон скрипт, который будет изменить имя файла в рабочий стол из PHP ..

Спасибо за все комментарии и предложения для решений .. =))

1

Вы можете напрямую переименовать файлы в php с помощью функции rename.

rename($oldname, $newname); 
1

Проблема заключается в том, когда вы делаете os.rename("a.txt", "b.txt") он ищет a.txt в директории, из которой приложение работает (так он ищет a.txt в /var/www/.

Вы должны дать как a.txt и b.txt полный путь:

os.rename('/home/user/Desktop/a.txt', '/home/user/Desktop/b.txt') 

Вы также должны убедиться, что www-data (или любой другой пользователь работает Apache) может записывать в каталог Desktop; однако с точки зрения безопасности это очень плохая идея. - любой скрипт, запущенный на сервере, может читать содержимое вашего рабочего стола (и даже удалять файлы).

0

Вам нужно что-то вроде:.

my_dir = os.path.dirname(os.path.realpath(sys.argv[0])) 

Это будет приравнять к каталогу try.py на самом деле в

Затем вы можете выполнить:

os.rename(os.path.join(my_dir, 'a.txt'), os.path.join(my_dir, 'b.txt')) 

Как уже упоминалось выше, это это не обязательно отличная идея от PoV ​​безопасности, хотя вам нужно предоставить разрешения на запись в php-скрипт.

я обычно ставлю код my_dir в if sys.argv[0]:, так что я все еще могу отладить из питона РЕПЛ:

if sys.argv[0]: 
    # running as executable 
    my_dir = os.path.dirname(os.path.realpath(sys.argv[0])) 
else: 
    # imported into interpreter 
    my_dir = '.' 

Таким образом, я все еще могу импортировать модуль в РЕПЛ отлаживать его, до тех пор, как я m в том же каталоге, что и файл.