我来过这里:
还有很多我没有复制的网址,有些在SO上,有些在其他网站上,当我认为我有快速解决方案的时候.
永远反复出现的问题是:使用Windows 7,32位Python 2.7.3,如何解决这个"非包装中尝试相对导入"的消息?我在pep-0328上构建了一个包的精确副本:
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
Run Code Online (Sandbox Code Playgroud)
我确实在适当的模块中创建了名为spam和eggs的函数.当然,它没有用.答案显然在我列出的第4个网址中,但这对我来说都是校友.我访问过的其中一个网址上有此回复:
相对导入使用模块的name属性来确定模块在包层次结构中的位置.如果模块的名称不包含任何包信息(例如,它设置为'main'),则解析相对导入,就像模块是顶级模块一样,无论模块实际位于文件系统的哪个位置.
上面的反应看起来很有希望,但它对我来说都是象形文字.所以我的问题是,如何让Python不回归"尝试非包装中的相对导入"?有一个答案涉及-m,据说.
有人可以告诉我为什么Python会给出错误信息,非包装意味着什么!,为什么以及如何定义"包裹",并且准确的答案足以让幼儿园儿童理解.
编辑:导入是从控制台完成的.
我有一个小python项目,具有以下结构 -
Project
-- pkg01
-- test01.py
-- pkg02
-- test02.py
-- logging.conf
Run Code Online (Sandbox Code Playgroud)
我计划使用默认日志记录模块将消息打印到stdout和日志文件.要使用日志记录模块,需要进行一些初始化 -
import logging.config
logging.config.fileConfig('logging.conf')
logger = logging.getLogger('pyApp')
logger.info('testing')
Run Code Online (Sandbox Code Playgroud)
目前,我在开始记录消息之前在每个模块中执行此初始化.是否可以在一个地方只执行一次初始化,以便通过整个项目记录重复使用相同的设置?
我们设置日志记录就像django docs告诉我们的那样:
https://docs.djangoproject.com/en/2.1/topics/logging/#using-logging
# import the logging library
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
def my_view(request, arg1, arg):
...
if bad_mojo:
# Log an error message
logger.error('Something went wrong!')
Run Code Online (Sandbox Code Playgroud)
我想在每个想要记录的Python文件中避免这一行:
logger = logging.getLogger(__name__)
我想要简单:
logging.error('Something went wrong!')
但我们希望保留一个功能:我们希望在日志记录输出中看到Python文件名.
到目前为止,我们使用以下格式:
'%(asctime)s %(name)s.%(funcName)s +%(lineno)s: %(levelname)-8s [%(process)d] %(message)s'
Run Code Online (Sandbox Code Playgroud)
示例输出:
2016-01-11 12:12:31 myapp.foo +68: ERROR Something went wrong
Run Code Online (Sandbox Code Playgroud)
怎么避免logger = logging.getLogger(__name__)?
我想知道在Python应用程序中执行日志记录的标准设置是什么.
我正在使用Logging类,并且我编写了自己的logger类来实例化Logging类.我的主要然后实例化我的记录器包装类.但是,我的main实例化其他类,我希望其他类也能够通过main中的logger对象写入日志文件.
如何使该logger对象可以被其他类调用?这几乎就像我们需要某种静态记录器对象来实现它.
我想问题的长短之处在于:如何在代码结构中实现日志记录,以便从main中实例化的所有类都可以写入同一个日志文件?我是否只需要在指向同一文件的每个类中创建一个新的日志记录对象?
我的目标是从多个模块进行日志记录,而只在一个地方配置记录器 - 在主程序中.如这个答案所示,应该包括
logging.config.fileConfig('/path/to/logging.conf')
Run Code Online (Sandbox Code Playgroud)
在主程序中,然后在所有其他模块中包括
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)
我相信这就是我在下面所做的,但我得到了意想不到的行为.
# c.py
import logging
import logging.config
import d
logging.config.fileConfig("logging.conf")
logger = logging.getLogger(__name__)
logger.warning('logging from c')
d.foo()
Run Code Online (Sandbox Code Playgroud)
# d.py
import logging
logger = logging.getLogger(__name__)
# this will print when d is imported
logger.warning('logging from d on import')
def foo():
# this does not print
logger.warning("logging from d on call foo()")
Run Code Online (Sandbox Code Playgroud)
$ python c.py
logging from d on import
logging from c
Run Code Online (Sandbox Code Playgroud)
我所期望的是,当d.foo()执行时c.py,将记录消息d …
我有各种各样的模块,我大量使用Python日志.当我像在Python文档中一样将它们导入主模块并尝试运行它时,我没有从日志记录中获得任何输出.有谁知道发生了什么?
在public下面导入的模块导入的模块中调用日志记录(这段代码太大而无法放在这里).下面的代码段是运行整个程序并初始化日志记录的地方:
import logging
from bottle import run, debug
import public
logging.basicConfig(level=logging.DEBUG)
if __name__ == '__main__':
logging.info('Started')
debug(mode=True)
run(host='localhost', port = 8080, reloader=True)
logging.info('Finished')
Run Code Online (Sandbox Code Playgroud) 是的,我看到python doc说:“记录器从未直接实例化,而是始终通过模块级函数logging.getLogger(name)进行实例化”,但是我有一个调试问题,并且想知道根本原因。
这是示例:
#!/usr/bin/python
import logging
logger = logging.getLogger("test")
format = "%(asctime)s [%(levelname)-8s] %(message)s"
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S"))
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.info("test")
Run Code Online (Sandbox Code Playgroud)
在此处使用logging.getLogger(“ test”),将不会打印日志消息。
如果我将logging.getLogger(“ test”)更改为logging.Logger(“ test”),则将打印日志消息。
#!/usr/bin/python
import logging
logger = logging.Logger("test")
format = "%(asctime)s [%(levelname)-8s] %(message)s"
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S"))
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.info("test")
Run Code Online (Sandbox Code Playgroud)
或者,我们可以使用logging.getLogger(“ test”)并将记录器级别设置为logging.DEBUG。
#!/usr/bin/python
import logging
logger = logging.getLogger("test")
format = "%(asctime)s [%(levelname)-8s] %(message)s"
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S"))
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.info("test")
Run Code Online (Sandbox Code Playgroud) 我对 Python 有点陌生,尤其是在多个文件中编写模块和函数,而不仅仅是原始脚本。
\n\n我正在编写一个命令行应用程序,我想要一个函数(我称之为argpconf)来解析命令行参数并相应地设置日志级别。最重要的是,我希望在此函数中设置一次日志级别,并在创建记录器时以最小的开销在所有模块中设置相同的日志级别。此外,我希望能够在使用通用格式化程序时识别消息来自的模块:
logging.Formatter("%(levelname)s : %(name)s : %(message)s")\nRun Code Online (Sandbox Code Playgroud)\n\n部分基于cookiecutter 模板,我创建了以下文件:
\n\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 api\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 some_functionality.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cli.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 core\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 argpconf.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 logger.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __version__.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __main__.py\nRun Code Online (Sandbox Code Playgroud)\n\ncore/logger.py有以下内容:
from logging import Formatter, Logger as _Logger, NullHandler, StreamHandler\n\nclass Logger(_Logger):\n def __init__(self, name=None):\n super(Logger, self).__init__(name or __name__.split(".")[0])\n self.addHandler(NullHandler()) # default to no output\n def start(self, level="WARN", stream=None,\n fmt="%(levelname)s : %(name)s : %(message)s"):\n handler = StreamHandler(stream)\n handler.setFormatter(Formatter(fmt))\n self.addHandler(handler)\n self.setLevel(level.upper())\n def …Run Code Online (Sandbox Code Playgroud)