为什么会出现IOError: [Errno 13]权限被拒绝的错误?

6
我正在为代码创建日志文件,但是我遇到了以下错误:
[Tue Jun 11 17:22:59 2013] [error] [client 127.0.0.1] import mainLCF [Tue Jun 11 17:22:59 2013] [error] [client 127.0.0.1] File "/home/ai/Desktop/home/ubuntu/LCF/GA-LCF/mainLCF.py", line 10, in [Tue Jun 11 17:22:59 2013] [error] [client 127.0.0.1] logging.basicConfig(filename='genetic.log',level=logging.DEBUG,format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') [Tue Jun 11 17:22:59 2013] [error] [client 127.0.0.1] File "/usr/lib/python2.7/logging/__init__.py", line 1528, in basicConfig [Tue Jun 11 17:22:59 2013] [error] [client 127.0.0.1] hdlr = FileHandler(filename, mode) [Tue Jun 11 17:22:59 2013] [error] [client 127.0.0.1] File "/usr/lib/python2.7/logging/__init__.py", line 901, in __init__ [Tue Jun 11 17:22:59 2013] [error] [client 127.0.0.1] StreamHandler.__init__(self, self._open()) [Tue Jun 11 17:22:59 2013] [error] [client 127.0.0.1] File "/usr/lib/python2.7/logging/__init__.py", line 924, in _open [Tue Jun 11 17:22:59 2013] [error] [client 127.0.0.1] stream = open(self.baseFilename, self.mode) [Tue Jun 11 17:22:59 2013] [error] [client 127.0.0.1] IOError: [Errno 13] Permission denied: '/genetic.log'
我已经检查了我想要创建日志的特定文件夹中的权限,但仍然出现错误。
我的代码如下(名称为mainLCF.py):
import logging import sys logging.basicConfig(filename='genetic.log',level=logging.DEBUG,format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.debug("starting of Genetic Algorithm")
sys.path.append("/home/ai/Desktop/home/ubuntu/LCF/ws_code")
import blackboard from pyevolve import * def eval_func(chromosome): # 这里有一些函数
我的系统文件结构如下:
/ home ai Desktop home ubuntu LCF ws_code GA-LCF blackboard.py main-LCF.py

我正在从 ws_code 中的另一个函数 lcf.py 中调用 mainLCF.py。


2
您正在尝试写入'/genetic.log',该文件位于文件系统的根目录,而不是您检查权限的任何文件夹中。 - Wooble
为什么会这样?它不应该在代码所在的任何目录中生成日志吗? - user2474411
顺便说一句:我不知道是不是因为你的代码缩短了,但你应该重新考虑使用星号导入。 - b3orn
3个回答

1

您需要使用logging.handlers Python模块更改日志文件路径。在我的情况下,我做了以下操作:

import logging
from logging.handlers import RotatingFileHandler
 import  blackboard

WEBAPP_CONSTANTS = {
'LOGFILE': '/home/ai/Desktop/home/ubuntu/LCF/GA-LCF/ga.log',
}
def getWebAppConstants(constant):
     return WEBAPP_CONSTANTS.get(constant, False)

LOGFILE = getWebAppConstants('LOGFILE')
log_handler = RotatingFileHandler(LOGFILE, maxBytes=1048576, backupCount=5)
log_handler.setFormatter(logging.Formatter( '%(asctime)s %(levelname)s: %(message)s ' '[in %(pathname)s:%(lineno)d]'))
applogger = logging.getLogger("GA")
applogger.setLevel(logging.DEBUG)
applogger.addHandler(log_handler)
applogger.debug("Starting of Genetic Algorithm")

from pyevolve import *

def eval_func(chromosome):
     some function here

它起作用了。但是我仍然不知道为什么之前它试图在根目录创建genetic.log。


是的,我想找到一种在不使用日志处理程序的情况下定义绝对路径的方法,但我没有找到。 - user2474411

0

虽然你的代码看起来正确,但我认为最好分配一个绝对路径。如果你在本地开发,而应用程序在另一台服务器上运行,可能会有一些差异,比如谁调用了进程。
建议将日志写入/var/log/app_name


0

看起来日志记录尝试打开日志文件作为/genetic.log。如果您将文件名作为关键字参数传递给logging.basicConfig,它会创建一个FileHandler,并将其传递给os.path.abspath,该函数会根据当前工作目录将文件名扩展为绝对路径。因此,您要么在根目录中,要么您的代码更改了当前的工作目录。


然而,我不在根目录中,也没有更改绝对路径。可能是由于Pyevolve库引起的。 - user2474411
你有没有想过如何将日志文件直接定向到特定的文件夹? - user2474411
可能不行,因为logging.basicConfig在导入pyevolve之前就被调用了。您如何启动mainLCF.py? - b3orn
你是如何从另一个文件中调用它的? - b3orn
我这样调用它:import sys; sys.append("mainLCF.py文件的路径名"); import mainLCF; 现在我从另一个文件中调用mainLCF.py的主函数。 - user2474411

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接