2014-08-27 33 views
2

我的服務器是Python和PHP的混合 - PHP的管理從用戶收到的消息,然後用參數的過程把它傳送到Python,然後返回相應的計算:Python記錄從PHP腳本統制擋住呼叫

#!/usr/bin/env python 

import argparse 

def addTwoArgs(a, b): 
    return a + b 

if __name__ == "__main__": 

    # create the top-level parser 
    parser = argparse.ArgumentParser() 

    parser.add_argument('integera', type=int, help='first integer') 
    parser.add_argument('integerb', type=int, help='second integer') 

    args = parser.parse_args() 

    if args.integera and args.integerb: 

     result = addTwoArgs(args.integera, args.integerb) 

     print(result) 

雖然我確信我可以在這裏做得更好(並且關於如何更好地設置這個以發送到PHP的建議將不勝感激),但它以當前的形式工作。這只是來自PHP的電話:

exec("python /home/ubuntu/php_test.py 60 7", $output); 

這將給出67的答案。一切都好。

但是,我試圖在日誌中添加以便知道PHP何時進行調用。即使在正式加入了處理程序,該腳本幾乎「退出」試圖創建一個文件處理程序時 - 或在下面的例子中調用handler = logging.FileHandler("addTwoArgs.log")時:

#!/usr/bin/env python 

import argparse 
import logging 

logger = logging.getLogger(__name__) 
logger.setLevel(logging.INFO) 

# create a file handler (PHP CALL FAILS HERE) 
handler = logging.FileHandler("addTwoArgs.log") 

# other logging commands 
.... 
.... 
logger.addHandler(handler) 

def addTwoArgs(a, b): 
    return a + b 

if __name__ == "__main__": 

    # create the top-level parser 
    parser = argparse.ArgumentParser() 

    parser.add_argument('integera', type=int, help='first integer') 
    parser.add_argument('integerb', type=int, help='second integer') 

    args = parser.parse_args() 

    if args.integera and args.integerb: 

     result = addTwoArgs(args.integera, args.integerb) 

     print(result) 

考慮這個腳本完美的作品時,通過SSH叫,它採取了而拿起記錄器可能是一個問題。我認爲這是用戶權限的問題。我可以通過具有相當全面特權的SSH運行腳本,但我將從Web瀏覽器(我認爲這裏使用的是www用戶)調用PHP腳本。

我試過將文件權限更改爲666,沒有任何更改。

我也試着用Python 3調用腳本,沒有任何改變。

exec("/usr/bin/python3 /home/ubuntu/php_test.py 60 7", $output); 

任何幫助將不勝感激!

回答

1
handler = logging.FileHandler("addTwoArgs.log") 

將嘗試創建一個addTwoArgs.log文件中當前工作目錄,這可能不是通過對正在執行過程中(因此會失敗)的用戶可寫。最後看到這個失敗的例子。

要解決你的問題,使用完整路徑,而不是,並確保用戶已寫入該路徑訪問:

# Edit your code: 
handler = logging.FileHandler("/var/log/addTwoArgs/main.log") 

# Run this once before in your shell 
mkdir -p /var/log/addTwoArgs 
chown www-data:www-data /var/log/addTwoArgs 

確保您更換www-data爲Web進程正在運行的實際用戶。


這裏就是我試圖用一個日誌文件的目錄,我沒有寫權限:

>>> handler = logging.FileHandler("/addTwoArgs.log") #/is only writable by root 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/Cellar/python/2.7.8/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 911, in __init__ 
    StreamHandler.__init__(self, self._open()) 
    File "/usr/local/Cellar/python/2.7.8/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 936, in _open 
    stream = open(self.baseFilename, self.mode) 
IOError: [Errno 13] Permission denied: '/addTwoArgs.log'