我正在编写一个Python应用程序,它将命令作为参数,例如:
$ python myapp.py command1
Run Code Online (Sandbox Code Playgroud)
我希望应用程序是可扩展的,即能够添加实现新命令的新模块,而无需更改主应用程序源.树看起来像:
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
Run Code Online (Sandbox Code Playgroud)
所以我希望应用程序在运行时找到可用的命令模块并执行适当的命令模块.
Python定义了一个__import__函数,它接受一个模块名称的字符串:
__import __(name,globals = None,locals = None,fromlist =(),level = 0)
该函数导入模块名称,可能使用给定的全局变量和局部变量来确定如何解释包上下文中的名称.fromlist给出了应该从name给出的模块导入的对象或子模块的名称.
所以目前我有类似的东西:
command = sys.argv[1]
try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
# Display error message
command_module.run()
Run Code Online (Sandbox Code Playgroud)
这很好用,我只是想知道是否可能有更惯用的方法来完成我们正在使用此代码.
请注意,我特别不想使用鸡蛋或扩展点.这不是一个开源项目,我不希望有"插件".重点是简化主应用程序代码,并在每次添加新命令模块时无需修改它.
我想在我的应用程序中实现一个上传和操作WebDAV服务器上的文件的功能.我正在寻找一个成熟的Python库,它将提供类似于os.*使用远程文件的模块的接口.谷歌搜索已经为Python中的WebDAV提供了一些选项,但我想知道这些日子有哪些更广泛使用.
我正在用Python编写日志收集/分析应用程序,我需要编写一个"规则引擎"来匹配日志消息并对其进行操作.
它需要具备以下功能:
我想象一个示例规则可能是这样的:
(message ~ "program\\[\d+\\]: message" and severity >= high) or (severity >= critical)
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用PyParsing或类似实际解析规则并构造解析树.
我想到的当前(尚未实现的)设计是为每个规则类型创建类,并根据解析树构造和链接它们.然后,每个规则都有一个"匹配"方法,可以使消息对象返回它是否与规则匹配.
很快,像:
class RegexRule(Rule):
def __init__(self, regex):
self.regex = regex
def match(self, message):
return self.regex.match(message.contents)
class SeverityRule(Rule):
def __init__(self, operator, severity):
self.operator = operator
def match(self, message):
if operator == ">=":
return message.severity >= severity
# more conditions here...
class BooleanAndRule(Rule):
def __init__(self, rule1, rule2):
self.rule1 = rule1
self.rule2 = rule2
def match(self, message):
return self.rule1.match(message) and self.rule2.match(message)
Run Code Online (Sandbox Code Playgroud)
然后,这些规则类将根据消息的分析树链接在一起,并在最高规则上调用match()方法,该方法将向下级联,直到评估完所有规则. …
似乎我必须缺少一些明显常用的习语,但缺少这两个功能似乎有点令我感到困惑.有some但它返回nil而不是False,为什么不是一个any?功能?
我想使用ctypes 映射pbs_errno在库中声明为全局的int值libtorque.so.
目前我可以这样加载库:
from ctypes import *
libtorque = CDLL("libtorque.so")
Run Code Online (Sandbox Code Playgroud)
并成功映射了一堆函数.但是,出于错误检查的目的,其中许多设置pbs_errno变量,所以我也需要访问它.但是,如果我尝试访问它,我得到:
>>> pytorque.libtorque.pbs_errno
<_FuncPtr object at 0x9fc690>
Run Code Online (Sandbox Code Playgroud)
当然,它不是一个函数指针,试图调用它会导致seg错误.
它int pbs_errno;在主头文件和extern int pbs_errno;API头文件中声明.
Objdump将符号显示为:
00000000001294f8 g DO .bss 0000000000000004 Base pbs_errno
Run Code Online (Sandbox Code Playgroud) 我有一组看起来像这样的表:
workflows = Table('workflows', Base.metadata,
Column('id', Integer, primary_key=True),
)
actions = Table('actions', Base.metadata,
Column('name', String, primary_key=True),
Column('workflow_id', Integer, ForeignKey(workflows.c.id), primary_key=True),
)
action_dependencies = Table('action_dependencies', Base.metadata,
Column('workflow_id', Integer, ForeignKey(workflows.c.id), primary_key=True),
Column('parent_action', String, ForeignKey(actions.c.name), primary_key=True),
Column('child_action', String, ForeignKey(actions.c.name), primary_key=True),
)
Run Code Online (Sandbox Code Playgroud)
我的ORM类看起来像:
class Workflow(Base):
__table__ = workflows
actions = relationship("Action", order_by="Action.name", backref="workflow")
class Action(Base):
__table__ = actions
children = relationship("Action",
secondary=action_dependencies,
primaryjoin=actions.c.name == action_dependencies.c.parent_action,
secondaryjoin=actions.c.name == action_dependencies.c.child_action,
backref="parents"
)
Run Code Online (Sandbox Code Playgroud)
因此,在我的系统中,每个操作都由工作流ID和名称的组合唯一标识.我希望每个动作都有,parents并且children属性引用其父动作和子动作.每个动作都可以有多个父母和孩子.
当我有一个如下功能时,会出现问题:
def set_parents(session, workflow_id, action_name, parents):
action = session.query(db.Action).filter(db.Action.workflow_id …Run Code Online (Sandbox Code Playgroud) 我有一个我通过ctypes访问的结构:
struct attrl {
char *name;
char *resource;
char *value;
struct attrl *next;
enum batch_op op;
};
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有Python代码,如:
# struct attropl
class attropl(Structure):
pass
attrl._fields_ = [
("next", POINTER(attropl)),
("name", c_char_p),
("resource", c_char_p),
("value", c_char_p),
Run Code Online (Sandbox Code Playgroud)
但是我不知道该用什么用于batch_op枚举.我应该把它映射到一个c_int或?
我在Qt设计器中创建了一个简单的表单,并尝试将其加载到我正在使用PySide创建但没有太多运气的Qt应用程序中.
这是'pyside-uic'生成的代码:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'clientEditorForm.ui'
#
# Created: Tue Nov 3 23:46:41 2009
# by: PySide uic UI code generator
#
# WARNING! All changes made in this file will be lost!
from PySide import QtCore, QtGui
class Ui_clientEditorForm(object):
def setupUi(self, clientEditorForm):
clientEditorForm.setObjectName("clientEditorForm")
clientEditorForm.resize(575, 446)
self.horizontalLayout_3 = QtGui.QHBoxLayout(clientEditorForm)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.splitter = QtGui.QSplitter(clientEditorForm)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName("splitter")
self.layoutWidget = QtGui.QWidget(self.splitter)
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout = QtGui.QVBoxLayout(self.layoutWidget)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout_2 = QtGui.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.searchLabel = QtGui.QLabel(self.layoutWidget) …Run Code Online (Sandbox Code Playgroud) 使用"Default"智能感知引擎时,我的C ++项目中的某些符号无法解析。事实证明,这是因为它们位于标头中,并在其中受到由makefile #ifdef传递给带有-D标志的gcc的宏的保护。我如何才能告诉智能感知引擎这些定义,以便它能够编译标头的那些部分?
我们组织中有许多混合Python/C的项目.目前,我们正在尝试为我们的项目标准化目录布局,并试图提出一个方便的方案.争论的一个方面是将C扩展模块放在树中的位置.
我们正在抛弃几个选项(相对于项目根目录):
./src/package/subpackage/module.c
Run Code Online (Sandbox Code Playgroud)
或者与包树中的python模块一起:
./package/subpackage/module.c
Run Code Online (Sandbox Code Playgroud)
或者在src子包中的目录中:
./package/subpackage/src/module.c
Run Code Online (Sandbox Code Playgroud)
将它们排除在包目录之外的一个原因可能是因为它会导致混乱,特别是如果有其他.c和.h文件本身不是模块但仍需要编译.同样在"集成"方案中,您如何处理多个模块使用的标头和文件?把它们放在一个共同的顶级目录中?
我有兴趣知道其他人正在使用什么,或者是否有任何已建立的最佳实践.
在Applescript中使用UI脚本时,您可能需要勾选一个复选框:
tell application "System Events"
tell process "Example Process"
click checkbox "Example Checkbox" of sheet 1 of window 1
end tell
end tell
Run Code Online (Sandbox Code Playgroud)
这有一个问题.如果已勾选示例复选框,则实际上取消勾选该框.你怎么能"勾选复选框,如果还没有勾选"?
Perl拥有出色的模块Term::ANSIScreen,可以进行各种花式光标移动和终端颜色控制.我想重新实现一个目前在Python中用Perl编写的程序,但终端ANSI颜色是其功能的关键.有人知道一个等价的吗?