因此,我试图创建一个更简单的日志记录模块,但是我不断收到没有意义的错误。
该模块位于%appdata%/python/site-packages/loggingLocal/__init__.py
模块代码如下:
class Logger:
def __init__(self):
pass
@classmethod
def llog(cls, file, typeM, message):
llog_f = open(file, "a")
llog_f.write("\n" + typeM + ": " + message)
llog_f.close
我用来利用该模块的代码如下:
import loggingLocal.__init__
logOb = Logger()
lfile = "logs/log.txt"
logOb.llog(lfile, "test", "testing testing 1 2 3")
我希望logs/log.txt
中的文件包含test: testing testing 1 2 3
,但出现错误:第三行上的Undefined variable 'Logger'
。这是没有意义的,因为我将logOb
分配给Logger
类,而不是变量。
我想指出的是,我知道我并不是在以最有效的方式做事,但这并不是我在这里的目的。
答案 0 :(得分:0)
loggingLocal.py
class Logger:
def __init__(self):
pass
@classmethod
def llog(cls, file, typeM, message):
llog_f = open(file, "a")
llog_f.write("\n" + typeM + ": " + message)
llog_f.close
main.py:
from loggingLocal import Logger
logOb = Logger()
lfile = "logs/log.txt"
logOb.llog(lfile, "test", "testing testing 1 2 3")
答案 1 :(得分:0)
导入模块时,只会将模块的名称添加到本地名称空间中,而不会添加模块的所有内容(尽管如果明确要求也可以获取)。
因此,如果您执行import loggingLocal
(不需要__init__
部分,请参见下面的更多内容),则只会在主模块的命名空间中获得名称loggingLocal
。要访问其中的Logger
类,您需要使用loggingLocal.Logger
。
或者,您可以使用备用导入语法from some_module import some_name
来具体说明要从导入的模块复制到自己的名称空间中的特定名称。在您的情况下,您可能需要from loggingLocal import Logger
。您可以根据需要提供多个名称,也可以提供*
而不是任何名称,在这种情况下,您将获得模块__all__
属性中列出的任何名称,或每个全局变量在另一个模块中,该模块的名称不能以下划线开头。
您的代码中还有其他一些小错误。我在上面提到过一个,您在__init__
语句中命名模块名称的import
部分。不用了__init__.py
是用于组成包根部分的模块的文件名。即,foo/__init__.py
成为foo
模块。如果由于某些其他原因(例如,因为您同时拥有foo/bar.py
和foo/baz.py
(可以导入为foo.bar
和foo.baz
)而不需要软件包,则可能不应该使用该结构。相反,只需将您的localLogging/__init__.py
文件重命名为localLogging.py
并摆脱子目录。
另一个问题是在Logger的实现中。当您尝试关闭在llog
中创建的文件时,实际上并没有成功。您仅引用close
方法,但从未实际调用它(您可能想做llog_f.close()
)。我建议改用with
语句来处理文件的打开和关闭:
with open(file, "a") as llog_f:
llog_f.write("\n" + typeM + ": " + message)
此代码将在with
语句后的缩进块末尾自动关闭文件。如果有异常导致该块以异常方式退出,它甚至会关闭文件。