ydf0509 / nb_log

pip install nb_log 各种日志handler和自动转化项目的任意print的效果。日志自动彩色炫酷,可点击控制台的日志自动精确跳转到pycharm的文件和行号。文件日志多进程切割安全。在10个最重要方面全方位超过loguru
378 stars 72 forks source link

始终提示 PermissionError: [Errno 13] Permission denied: '/pythonlogs' #3

Closed hugo2017 closed 3 years ago

hugo2017 commented 3 years ago

按照文档,在创建logger时 logger = LogManager().get_logger_and_add_handlers(log_filename='app.log'),会报错,且nb_log_config.py未创建,虽然console中提示创建了文件。

将 nb_log_config.py 文件复制到项目根目录,依然报错。

ydf0509 commented 3 years ago

1、配置文件是第一次运行代码会自动创建生成的。首先要看你是怎么启动的,在pycahrm启动不需要亲自手动添加pythonpath,cmd或者shell中敲击python xx.py 需要先临时会话设置PYTHONPATH为你的项目根目录,你不会不知道什么事PYTHONPATH吧?在cmd你不设置PYTHONPATH,就无法识别你项目的根目录了,会把python安装目录下的文件夹当做第一pythonpath,就创建不了。百度PYTHONPATh环境变量吧,这个和nblog无关,每个python人员都要知道。 2、Permission denied: '/pythonlogs',一般是mac系统或者linux系统的非root账号没权限写入,日志默认文件夹配置是可以在生成的nb_log_config.py里面修改的,放在一个有权限的文件夹就行了,也可以在get_logger时候,在函数入参指定一个文件夹。

ydf0509 commented 3 years ago

重新安装下,生成配置文件加了提示了

def auto_creat_config_file_to_project_root_path():
    # print(Path(sys.path[1]).as_posix())
    # print((Path(__file__).parent.parent).absolute().as_posix())
    """
    :return:
    """
    # noinspection PyPep8
    """
        如果没设置PYTHONPATH,sys.path会这样,取第一个就会报错
        ['', '/data/miniconda3dir/inner/envs/mtfy/lib/python36.zip', '/data/miniconda3dir/inner/envs/mtfy/lib/python3.6', '/data/miniconda3dir/inner/envs/mtfy/lib/python3.6/lib-dynload', '/root/.local/lib/python3.6/site-packages', '/data/miniconda3dir/inner/envs/mtfy/lib/python3.6/site-packages']

        ['', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\python36.zip', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\DLLs', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\lib', 'F:\\minicondadir\\Miniconda2\\envs\\py36', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\lib\\site-packages', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\lib\\site-packages\\multiprocessing_log_manager-0.2.0-py3.6.egg', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\lib\\site-packages\\pyinstaller-3.4-py3.6.egg', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\lib\\site-packages\\pywin32_ctypes-0.2.0-py3.6.egg', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\lib\\site-packages\\altgraph-0.16.1-py3.6.egg', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\lib\\site-packages\\macholib-1.11-py3.6.egg', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\lib\\site-packages\\pefile-2019.4.18-py3.6.egg', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\lib\\site-packages\\win32', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\lib\\site-packages\\win32\\lib', 'F:\\minicondadir\\Miniconda2\\envs\\py36\\lib\\site-packages\\Pythonwin']
        """
    if '/lib/python' in sys.path[1] or r'\lib\python' in sys.path[1] or '.zip' in sys.path[1]:
        raise EnvironmentError('''如果用pycahrm启动,默认不需要你手动亲自设置PYTHONPATH,如果你是cmd或者shell中直接敲击python xx.py 来运行,
                               报现在这个错误,你现在肯定是没有设置PYTHONPATH环境变量,不要设置永久环境变量,设置临时会话环境变量就行,
                               windows设置  set PYTHONPATH=你当前python项目根目录,然后敲击你的python运行命令    
                               linux设置    export PYTHONPATH=你当前python项目根目录,然后敲击你的python运行命令    
                               要是连PYTHONPATH这个知识点都不知道,那就要google 百度去学习PYTHONPATH作用了,非常重要非常好用,
                               不知道PYTHONPATH作用的人,在深层级文件夹作为运行起点导入外层目录的包的时候,如果把深层级文件作为python的执行文件起点,经常需要到处很low的手写 sys.path.insert硬编码,这种方式写代码太low了。
                               知道PYTHONPATH的人无论项目有多少层级的文件夹,无论是多深层级文件夹导入外层文件夹,代码里面永久都不需要出现手动硬编码操纵sys.path.append
                               ''')
    # with (Path(sys.path[1]) / Path('nb_log_config.py')).open(mode='w', encoding='utf8') as f:
    #     f.write(config_file_content)
    copyfile(Path(__file__).parent / Path('nb_log_config_default.py'), Path(sys.path[1]) / Path('nb_log_config.py'))
hugo2017 commented 3 years ago

重新pip install,问题解决了,不过解决过程有些不自然。命令行 export PYTHONPATH 后,能够生成配置文件。get_logger中设置了当前项目的路径,依然报错 Permission denied: '/pythonlogs',通过修改 nb_log_config.py 日志路径,去掉get_logger中路径配置,问题解决了。按说 PYTHONPATH 不用配置也有默认的,都在项目根目录执行了,可以直接在执行目录创建配置文件和log文件。约定大于配置。

对项目的设计思路比较认可,logger这东西不应该让开发者费太多精力,最佳方式参考java中,约定在项目根目录(或者通过环境变量指定配置文件路径)添加日志配置文件,就能够生效,如果没有此配置文件,用默认配置。

一直做JAVA开发,第一次用python开发一个自己的树莓派项目,两种技术实践风格差异较大,但好的东西可以相互借鉴。

ydf0509 commented 3 years ago

默认在项目根目录行日志文件夹不好,git要添加gitignore过滤,而且如果10个项目每个项目生成的日志地方在不同的文件夹里面,并不好。我喜欢一个文件夹下面查看所有项目的日志,这样不需要切换很多个项目文件夹下去才能看不方便。这个比log4j配置简单。

ydf0509 commented 3 years ago

新发的包照顾mac和linux非root用户了,默认文件夹地方改成在用户的 home/[username] 下面,这样就不会出现创建和写入不到根目录下的/pythonlogs文件夹了。我之前的开发基于linux root用户很容易使用/pythonlogs没问题,如果使用非root用户那肯定是没权限写入了。

ydf0509 commented 3 years ago

依然报错 Permission denied: '/pythonlogs' ,这个是权限原因造成的,这是绝对目录,一般的linux子用户无法操作这个文件夹,除非是root权限。

你要使用 pip install nb_log --upgrade -i https://pypi.org/simple,不要使用国内加速源,因为是刚刚1小时发布的,国内没有那么快同步速度

现在默认文件夹改成了 home/[username] 下面了。例如你的linux用户名是 xiaomin,那么默认会创建并在 /home/xiaomin/pythonlogs文件夹下写入日志文件。

LOG_PATH = '/pythonlogs'  # 默认的日志文件夹,如果不写明磁盘名,则是项目代码所在磁盘的根目录下的/pythonlogs
# LOG_PATH = Path(__file__).absolute().parent / Path("pythonlogs")   #这么配置就会自动在你项目的根目录下创建pythonlogs文件夹了并写入。
if os.name == 'posix':  # linux非root用户和mac用户无法操作 /pythonlogs 文件夹,没有权限,默认修改为   home/[username]  下面了。例如你的linux用户名是  xiaomin,那么默认会创建并在 /home/xiaomin/pythonlogs文件夹下写入日志文件。
    home_path = os.environ["HOME"]  # 这个是获取linux系统的当前用户的主目录,不需要亲自设置
    LOG_PATH = Path(home_path) / Path('/pythonlogs')  # linux mac 权限很严格,非root权限不能在/pythonlogs写入,修改一下默认值。