2013-10-02 115 views
1

這是一個來自raspberrypi.stackexchange.com的轉貼問題。雖然我試圖在樹莓派上使用python,但由於它不涉及任何pi特定的事情,所以我在這裏發佈了一些人的建議。原帖是here從python返回256代碼


我試圖做一個Web UI來更改rapsberry PI的日期,但我不斷收到256

返回代碼目前我有什麼是這樣的:

網頁 - >提交一個Ajax請求python腳本 蟒蛇檢查字符串找什麼類型的命令(在這種情況下,時間/日期命令),拼在一起的,如:

sudo date --set="20130901 20:10" 

並將其存儲在變量commandString中。然後python去:

os.system(commandString) 

和返回值一直傳遞到網站ui打印出來。

我現在還將commandString的值返回到網絡用戶界面以驗證它,它看起來沒問題。

問題是,我每次測試時,都會返回256作爲錯誤返回碼。樹莓派上的日期當然不會改變,因爲我在前後手動檢查它。

但是,如果我手動去到Python的樹莓派和嘗試:

commandString = 'sudo date --set="20130901 20:10"' 
os.system(commandString) 

它的工作原理沒有問題。如果我在沒有sudo的情況下嘗試它,那麼我的返回值也是256,所以我想也許這是我的原始腳本的權限問題。我試過this link來檢查我的腳本的權限,它似乎沒問題? (os.geteuid()爲0)

如果重要,我使用lighttpd和fastcgi從web ui運行python。我的lighttpd配置目前是:

fastcgi.server = (
    ".py" => (
    "python-fcgi" => (
    "socket" => "/tmp/fastcgi.python.socket", 
    "bin-path" => "/var/www/command.py", 
    "check-local" => "disable", 
    "max-procs" => 1) 
    ) 
) 

關於我失蹤的任何想法?


在原來的職位,也有人建議我嘗試類似:

echo <password> | sudo -S date --set="20130829 02:02 

雖然它可能不是一個好主意,把我的root密碼那樣,我嘗試過了,得到了相同的結果:它在終端/ shell和python解釋器中工作,但不通過web ui到python。

回答

0

UPDATE:或者只是使用/usr/bin/sudo /bin/date ...來確保找到命令。

試試這個:

import subprocess 

p = subprocess.Popen('sudo -S date --set ...', shell=True, stdin=subprocess.PIPE) 
p.communicate(input='<your password>') 

這是推出一個子進程(通過外殼)的更合適的方式,並將其發送一些輸入。

如果您還需要閱讀過程的輸出,然後例如:

p = subprocess.Popen('sudo -S date --set ...', shell=True, 
        stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = p.communicate(input='<your password>') 
print "\n".join("out: " + x for x in out.split('\n')) 
print "\n".join("err: " + x for x in err.split('\n')) 

...或只是採取的out和/或err內容,並分析它們。

+0

你好,嘗試第一種方法(不需要輸出這個部分)現在產生一個錯誤代碼1.從搜索中,我認爲這意味着「操作不允許」? – mitim

+0

好的。抱歉,馬上發表另一條評論,但這真的很奇怪。爲了好玩,我嘗試了沒有sudo(只是日期--set = ...),並將p.communicate改爲p.wait。有趣的是,我得到我的返回碼爲0,它似乎工作。 O.o關於爲什麼添加sudo(有和沒有密碼)的任何想法都給出了1的返回碼,但沒有讓它通過? (在腳本內os.geteuid()始終爲0)。我想我需要休息一下,關閉我的pi,然後再選擇它,以後再驗證,因爲這對於它的工作原理來說非常隨意。 = _ = – mitim

+0

是...這似乎現在工作。使用子進程而不是os.system而不使用'sudo'與我的命令。 – mitim

0

檢查環境是否實際上可以在搜索路徑中找到sudodate(或任何其他您想要執行的命令)。

您也可以使用絕對路徑到sudo和其他命令,例如, /usr/sbin/sudo