簡體   English   中英

被困在os.rename()

[英]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.txtb.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM