前言

记录一下最近的开发过程中遇到的一些问题和解决办法。

Python 静态方法问题

Python的类方法中,一旦某个方法被声明为静态方法,即加入了修饰符@staticmethod,该方法只能直接访问自己声明的一些变量,不能通过self指针访问类中的实例属性。

我使用了一个watchdog的轮子实现文件监控,按照文档样例覆写了父类中的on_any_event()方法,且需要使该方法成为静态方法。框架如下:

class Handler(FileSystemEventHandler):
controller = None
@staticmethod
def on_any_event(event):
if event.is_directory:
...

elif event.event_type == 'created':
...

else:
...

其中,有一行语句需要访问调用该类的控制器controller,但是不能通过self.controller访问,需要采用Handler.controller这样的方法访问,同时在外部需要对该controller赋值。例如:

Handler.controller._model.alter_operation(sql)

子进程调用问题

问题来源

我生成了一个bash脚本,想要在Python程序运行过程中通过subprocess库执行这个shell脚本。于是我采用了subprocess.Popen()方法执行。大致情况如下:

f = open("import.sh", "w+")
f.write("#!/bin/bash")
f.write(bashcmd)
time.sleep(3)
process = subprocess.run(["chmod" ,"+x","import.sh"])
subprocess.Popen(["/bin/bash",'./import.sh'])

问题是,如果在Popen后没有其他的Python语句,该条语句能够正常执行,bash脚本运行正常,但是一旦在此条语句后加入任何的Python语句,如print(),该bash脚本都不能正常工作。

解决方案

这其实是个假的解决方案,留有隐患,因为我还不知道这个问题的机理,只是想办法绕过了它。绕过办法很简单,就是把原先写在subprocess.Popen(["/bin/bash",'./import.sh'])这一行后的所有语句都等价地修改成bash脚本中的内容,这样使其成为最后的一行Python语句,能够正常执行。改天一定要搞清楚这里到底是怎么回事。