所以现在我需要创建并实现将用于登录数据库的Python日志记录模块的扩展.基本上我们有几个python应用程序(都在后台运行),当前记录到文本文件的随机混搭.这使得几乎不可能发现某个应用程序是否失败.
给我的问题是将所述日志记录移动到文本文件到oracle DB.这些表已经被定义,并且需要记录的东西,但是现在,我正在寻找添加另一个将记录到数据库的日志记录处理程序.
我使用的是python 2.5.4和cx_Oracle,一般应用程序可以作为服务/守护程序或直接应用程序进行以太运行.
我只是好奇地想知道最好的方法是什么.几个问题:
如果cx_Oracle发生任何错误,应将这些错误记录在哪里?如果它的下降最好只是让记录器退回到默认文本文件?
一段时间后,我们开始强制人们使用sys.stderr/stdout.write而不是print,所以最糟糕的情况是我们不会遇到任何关于print被弃用的问题.有没有办法无缝地将所有成千上万的sys.std调用直接传送到记录器中,并让记录器拾取松弛?
在每条记录的消息之后,脚本是否应自动执行提交?(每秒会有几十个.)
为日志记录系统实现新处理程序的最佳方法是什么?从基本的Handler类继承似乎是最简单的.
任何想法/建议都会很棒.
我有一些代码,我试图让它与ESRI的地理处理器很好地配合.但是,ESRI的地理处理器运行在Python 2.2,2.3,2.4,2.5上.我们需要让我们的工具适用于任何版本.因此,我花了很多时间为不同的版本编写解决方法,使得包装器地理处理器在所有版本中具有相同的功能.
现在这里有一件大事,是否有某种应用程序基本上可以扫描模块,看它的语法和方法是否与上述Python版本向后兼容?
不幸的是,我无法安装Python 2.2,因为我有Arcgis 9.3,它需要Python 2.5.反之亦然,我已经完成了所有模块依赖关系的排序和计算.(win32com,ctypes等).
但我担心我的实际代码,我可能花上几个小时去阅读哪些关键字添加了什么版本等,但这基本上将是一个巨大的头痛.是否有某种应用程序可以执行这些操作?
我在几个例子中注意到我看到这样的事情:
# Comments explaining code i think
@innerclass
Run Code Online (Sandbox Code Playgroud)
要么:
def foo():
"""
Basic Doc String
"""
@classmethod
Run Code Online (Sandbox Code Playgroud)
谷歌搜索并没有让我走得太远,只是对这是什么的一般定义.另外我在python文档中找不到任何东西.
这些怎么办?
我目前正在尝试使用pywin32创建win32服务.我的主要参考点是本教程:
http://code.activestate.com/recipes/551780/
我不明白的是初始化过程,因为守护进程永远不会被Daemon()直接初始化,而是我的理解它由以下内容初始化:
mydaemon = Daemon
__svc_regClass__(mydaemon, "foo", "foo display", "foo description")
__svc_install__(mydaemon)
Run Code Online (Sandbox Code Playgroud)
其中svc_install通过调用守护进程来处理初始化.init()并将一些参数传递给它.
但是,如何在不使用服务的情况下初始化守护进程对象?在我启动服务之前,我想做一些事情.有没有人有任何想法?
class Daemon(win32serviceutil.ServiceFramework):
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
def SvcDoRun(self):
self.run()
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def start(self):
pass
def stop(self):
self.SvcStop()
def run(self):
pass
def __svc_install__(cls):
win32api.SetConsoleCtrlHandler(lambda x: True, True)
try:
win32serviceutil.InstallService(
cls._svc_reg_class_,
cls._svc_name_,
cls._svc_display_name_,
startType = win32service.SERVICE_AUTO_START
)
print "Installed"
except Exception, err:
print str(err)
def __svc_regClass__(cls, name, display_name, description):
#Bind the values …Run Code Online (Sandbox Code Playgroud) 所以现在我们有很多python脚本,我们正在尝试整合它们并修复和裁员.我们要做的一件事是确保所有sys.stdout/sys.stderr进入python日志记录模块.
现在最重要的是,我们希望打印出以下内容:
[<ERROR LEVEL>] | <TIME> | <WHERE> | <MSG>
Run Code Online (Sandbox Code Playgroud)
现在所有的python错误消息中的所有sys.stdout/sys.stderr消息的格式都是[LEVEL] - MSG,它们都是使用sys.stdout/sys.stderr编写的.我可以在我的sys.stdout包装器和sys.stderr包装器中解析这个问题.然后根据解析的输入调用相应的日志记录级别.
所以基本上我们有一个名为foo的包,以及一个名为log的子包.在__init__.py我们定义以下内容:
def initLogging(default_level = logging.INFO, stdout_wrapper = None, \
stderr_wrapper = None):
"""
Initialize the default logging sub system
"""
root_logger = logging.getLogger('')
strm_out = logging.StreamHandler(sys.__stdout__)
strm_out.setFormatter(logging.Formatter(DEFAULT_LOG_TIME_FORMAT, \
DEFAULT_LOG_TIME_FORMAT))
root_logger.setLevel(default_level)
root_logger.addHandler(strm_out)
console_logger = logging.getLogger(LOGGER_CONSOLE)
strm_out = logging.StreamHandler(sys.__stdout__)
#strm_out.setFormatter(logging.Formatter(DEFAULT_LOG_MSG_FORMAT, \
# DEFAULT_LOG_TIME_FORMAT))
console_logger.setLevel(logging.INFO)
console_logger.addHandler(strm_out)
if stdout_wrapper:
sys.stdout = stdout_wrapper
if stderr_wrapper:
sys.stderr = stderr_wrapper
def cleanMsg(msg, is_stderr = False):
logy = logging.getLogger('MSG')
msg = msg.rstrip('\n').lstrip('\n')
p_level …Run Code Online (Sandbox Code Playgroud) 所以我有这个正则表达式:
(^(\s+)?(?P<NAME>(\w)(\d{7}))((01f\.foo)|(\.bar|\.goo\.moo\.roo))$|(^(\s+)?(?P<NAME2>R1_\d{6}_\d{6}_)((01f\.foo)|(\.bar|\.goo\.moo\.roo))$))
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试对此进行匹配:
B048661501f.foo
我收到此错误:
File "C:\Python25\lib\re.py", line 188, in compile
return _compile(pattern, flags)
File "C:\Python25\lib\re.py", line 241, in _compile
raise error, v # invalid expression
sre_constants.error: redefinition of group name 'NAME' as group 9; was group 3
如果我不能在同一个正则表达式中为两个不同的情况定义同一组两次,我该怎么办?
我正在使用ESRI的ArcObjects COM库,我正在努力弄清楚"选择"应该是什么类型:
IMxDocument doc = m_application.Document as IMxDocument;
object selected = doc.SelectedItem;
Run Code Online (Sandbox Code Playgroud)
SelectedItem返回一个comobject(Not Null),通常表示当前选择的数据类型.但是我没有最微弱的想法,我应该把它投入到什么类型.当我调试它时,我真的没有看到任何有用的东西:
(在设置值后观察调试)
ESRI的ArcObjects库非常庞大,文档记录很差,我简直无法理解.我甚至竟然手动检查了大约50个我认为应该是的界面.
有没有人有任何想法我怎么能搞清楚这一点?
编辑澄清他们的文档绝对没有帮助,他们的论坛也没有.
如果我在python中有一个dictonary,那么.keys和.values会以相同的顺序返回相应的元素吗?
例如
foo = {'foobar' : 1, 'foobar2' : 4, 'kittty' : 34743}
Run Code Online (Sandbox Code Playgroud)
对于它返回的键:
>>> foo.keys()
['foobar2', 'foobar', 'kittty']
Run Code Online (Sandbox Code Playgroud)
现在,foo.values()将返回元素的顺序与其对应的键相同吗?
有没有办法以编程方式区分导致IOException的原因?例如,如果在写入期间发生错误,Java将抛出IOException.如果磁盘空间不足,有人断开网络驱动器或其他东西,我该如何判断是否存在违反访问权限的情况?
我无法真正解析消息,因为似乎没有任何标准化的消息格式,Sun(或者我现在认为的Oracle)似乎没有任何标准格式.
(我需要使用Java来修复一个非常破碎的系统.)
我正在使用boost::property_tree.文档非常模糊,大部分内容总体上无益.查看源代码/示例也没有那么多帮助.
我想知道的是以下内容:
<VGHL>
<StringTable>
<Language>EN</Language>
<DataPath>..\\Data\\Resources\\Strings\\stringtable.bst</DataPath>
</StringTable>
</VGHL>
Run Code Online (Sandbox Code Playgroud)
如何迭代当前级别的所有元素?如果我这样做:
read_xml(fin, bifPropTree);
VGHL::String tablePath;
BOOST_FOREACH(boost::property_tree::wiptree::value_type &v,
bifPropTree.get_child(L"VGHL.StringTable"))
{
m_StringTable->ParseEntry(v.second, tablePath);
}
Run Code Online (Sandbox Code Playgroud)
在ParseEntry我试试这个:
VGHL::String langName = stringTree.get<VGHL::String>(L"StringTable.Language");
Run Code Online (Sandbox Code Playgroud)
导致异常(不存在).我也试过这个:
VGHL::String langName = stringTree.get<VGHL::String>(L"Language");
Run Code Online (Sandbox Code Playgroud)
同样的问题.
根据我的理解,当我打电话时,ParseEntry我正在传递对该节点的树的引用.
当我有多个StringTable使用属性树的条目时,有没有办法解决这个问题?