被困在os.rename()

时间:2015-04-02 04:58:33

标签: php python html

我是ubuntu用户..我在php中有一个命令执行python文件.. python文件设置为可执行..所以,我的php命令是: -

 shell_exec("try.py");

python文件位于桌面..但php文件位于www文件夹..

 /var/www/try.php
在try.py中的

,我有一个代码来重命名桌面上的文件,如下所示: -

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

所以,try.py和a.txt在桌面上..

我的问题是,当我执行php文件时,它会显示"输入"只是但没有"退出" ..所以我想它不能执行os.rename可能是因为root权限或任何我不知道的..我已经尝试了一些解决方案来禁用sudo的密码但是我仍然没有显示"退出"。

但是,如果我直接通过在桌面上双击它并执行它来执行try.py,则命令可以完成并且输出显示: -

enter
exit

所以,谁知道如何使用php执行它?

4 个答案:

答案 0 :(得分:1)

您可以使用rename功能直接重命名php中的文件。

rename($oldname, $newname);

答案 1 :(得分:1)

问题在于,当您正在os.rename("a.txt", "b.txt")时,它正在运行应用程序的目录中查找a.txt(因此它正在a.txt中查找/var/www/

您应该为a.txtb.txt提供完整路径:

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

您还必须确保www-data(或任何正在运行Apache的用户)可以写入Desktop目录;但从安全角度来看,这是一个非常糟糕的主意 - 服务器上运行的任何脚本都可以读取桌面内容(甚至删除文件)。

答案 2 :(得分:1)

最后,我得到了解决方案..

为了能够使用os.rename重命名桌面文件,我们需要编辑sudoers中的一些配置..

它涉及visudo的一些步骤以及php脚本..

在visudo中(使用命令" sudo 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]");
?>

对于python文件是一样的..

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

好..这就是解决方案..现在我可以运行python脚本,它将从php更改桌面文件的名称..

感谢您对解决方案的所有意见和建议。=))

答案 3 :(得分: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]:中,这样我仍然可以从python REPL调试:

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

这样我仍然可以将模块导入REPL进行调试,只要我在与相关文件相同的目录中。