有时我发现自己处于需要执行多个顺序命令的情况:
try:
foo(a, b)
except Exception, e:
baz(e)
try:
bar(c, d)
except Exception, e:
baz(e)
...
Run Code Online (Sandbox Code Playgroud)
只需要忽略异常时就会出现相同的模式.
这感觉多余,并且过多的语法使得在阅读代码时难以理解.
在C中,我很容易用宏来解决这类问题,但不幸的是,这不能在直接的python中完成.
问题:在遇到这种模式时,如何才能最好地减少代码占用空间并提高代码可读性?
每次导入包含大量静态正则表达式的python文件时,都会花费cpu周期将字符串编译到内存中的代表状态机中.
a = re.compile("a.*b")
b = re.compile("c.*d")
...
Run Code Online (Sandbox Code Playgroud)
问题:是否可以以预编译的方式将这些正则表达式存储在磁盘上的缓存中,以避免在每次导入时执行正则表达式编译?
腌制对象只需执行以下操作,无论如何都会导致编译:
>>> import pickle
>>> import re
>>> x = re.compile(".*")
>>> pickle.dumps(x)
"cre\n_compile\np0\n(S'.*'\np1\nI0\ntp2\nRp3\n."
Run Code Online (Sandbox Code Playgroud)
而re对象是unmarshallable:
>>> import marshal
>>> import re
>>> x = re.compile(".*")
>>> marshal.dumps(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: unmarshallable object
Run Code Online (Sandbox Code Playgroud) Python对环境变量的访问并不能准确反映操作系统对进程环境的看法.
在特定情况下,os.getenv和os.environ没有按预期运行.
有没有办法正确地获得正在运行的进程环境?
为了证明我的意思,拿两个大致相同的程序(第一个在C中,另一个在python中):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]){
char *env;
for(;;){
env = getenv("SOME_VARIABLE");
if(env)
puts(env);
sleep(5);
}
}
Run Code Online (Sandbox Code Playgroud)
import os
import time
while True:
env = os.getenv("SOME_VARIABLE")
if env is not None:
print env
time.sleep(5)
Run Code Online (Sandbox Code Playgroud)
现在,如果我们运行C程序并使用gdb附加到正在运行的进程并通过执行以下操作强制更改引擎环境:
(gdb) print setenv("SOME_VARIABLE", "my value", 1)
[Switching to Thread -1208600896 (LWP 16163)]
$1 = 0
(gdb) print (char *)getenv("SOME_VARIABLE")
$2 = 0x8293126 "my value"
Run Code Online (Sandbox Code Playgroud)
那么前面提到的C程序将每5秒开始喷出一次"我的价值".然而,前面提到的python程序不会.
在这种情况下,有没有办法让python程序像C程序一样运行?
(是的,我意识到这是一个在运行过程中执行的非常模糊且可能具有破坏性的操作)
此外,我目前正在使用python 2.4,这可能已在更高版本的python中修复.
在Linux中,查看进程内存映射的最简单方法是查看/proc/PID/maps,给出如下内容:
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm 08056000-08058000 rw-p 0000d000 03:0c 64593 /usr/sbin/gpm 08058000-0805b000 rwxp 00000000 00:00 0 40000000-40013000 r-xp 00000000 03:0c 4165 /lib/ld-2.2.4.so 40013000-40015000 rw-p 00012000 03:0c 4165 /lib/ld-2.2.4.so 4001f000-40135000 r-xp 00000000 03:0c 45494 /lib/libc-2.2.4.so 40135000-4013e000 rw-p 00115000 03:0c 45494 /lib/libc-2.2.4.so 4013e000-40142000 rw-p 00000000 00:00 0 bffff000-c0000000 rwxp 00000000 00:00 0
如何在OSX 10.5或10.6下获取有关进程自身内存映射的等效信息(地址范围,保护,映射文件名等等)?