[英]Stuck at os.rename()
我是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执行它?
您可以使用rename
功能直接在php
重命名文件。
rename($oldname, $newname);
问题是当你在做os.rename("a.txt", "b.txt")
它正在运行应用程序的目录中查找a.txt
(因此它正在/var/www/
寻找a.txt
) /var/www/
。
你应该给a.txt
和b.txt
两个完整的路径:
os.rename('/home/user/Desktop/a.txt', '/home/user/Desktop/b.txt')
您还必须确保www-data
(或任何正在运行Apache的用户)可以写入Desktop目录; 但从安全角度来看,这是一个非常糟糕的主意 - 服务器上运行的任何脚本都可以读取桌面内容(甚至删除文件)。
最后,我得到了解决方案..
为了能够使用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更改桌面文件的名称..
感谢您对解决方案的所有意见和建议.. =))
你需要这样的东西:
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进行调试,只要我和相关文件位于同一个目录中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.