【问题标题】:Why am I getting IOError: [Errno 13] Permission denied?为什么我收到 IOError: [Errno 13] Permission denied?
【发布时间】:2023-11-25 21:57:01
【问题描述】:

我正在为代码创建日志文件,但出现以下错误:

[2013 年 6 月 11 日星期二 17:22:59] [错误] [客户端 127.0.0.1] 导入 mainLCF [2013 年 6 月 11 日星期二 17:22:59] [错误] [客户端 127.0.0.1] 文件“/home/ai/Desktop/home/ubuntu/LCF/GA-LCF/mainLCF.py”,第 10 行,在 [2013 年 6 月 11 日星期二 17:22:59] [错误] [客户端 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') [2013 年 6 月 11 日星期二 17:22:59] [错误] [客户端 127.0.0.1] 文件“/usr/lib/python2.7/logging/__init__.py”,第 1528 行,在 basicConfig [2013 年 6 月 11 日星期二 17:22:59] [错误] [客户端 127.0.0.1] hdlr = FileHandler(文件名,模式) [2013 年 6 月 11 日星期二 17:22:59] [错误] [客户端 127.0.0.1] 文件“/usr/lib/python2.7/logging/__init__.py”,第 901 行,在 __init__ [2013 年 6 月 11 日星期二 17:22:59] [错误] [客户端 127.0.0.1] StreamHandler.__init__(self, self._open()) [2013 年 6 月 11 日星期二 17:22:59] [错误] [客户端 127.0.0.1] 文件“/usr/lib/python2.7/logging/__init__.py”,第 924 行,在 _open [2013 年 6 月 11 日星期二 17:22:59] [错误] [客户端 127.0.0.1] 流 = 打开(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)

导入日志 导入系统 logging.basicConfig(filename='genetic.log',level=logging.DEBUG,format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M: %S %p') logging.debug("开始遗传算法") sys.path.append("/home/ai/Desktop/home/ubuntu/LCF/ws_code") 进口黑板 从 pyevolve 导入 * def eval_func(染色体): 这里有一些功能

我系统的文件结构是:

/ 家 艾 桌面 家 ubuntu LCF ws_code GA-LCF blackboard.py main-LCF.py

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

【问题讨论】:

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

标签: python python-2.7 permissions permission-denied ioerror


【解决方案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

它奏效了。但是我仍然不知道为什么它早先尝试在根目录下制作generic.log。

【讨论】:

  • 是的..我想找到定义绝对路径的方法而不使用日志处理程序,但我找不到。
【解决方案2】:

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

【讨论】:

  • 但是我不在根目录中,我的代码也没有改变绝对路径。可能是因为 Pyevolve 库。
  • 您知道如何将日志文件定向到特定文件夹吗?
  • 可能不会,因为在导入 pyevolve 之前调用了 logging.basicConfig。如何启动 mainLCF.py?
  • 你如何从另一个文件中调用它?
  • 我这样称呼它:import sys; sys.append("mainLCF.py文件路径名");import mainLCF;现在我从另一个文件中调用 mainLCF.py 的 main 函数。
【解决方案3】:

虽然您的代码看起来是正确的,但我认为最好指定一个绝对路径。如果您在本地机器上开发并且应用程序在另一台服务器上运行,则可能存在一些差异,例如谁调用了该过程。
建议将日志写入/var/log/app_name

【讨论】: