2014-08-27 31 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'