在python中重新读取父进程的环境

时间:2012-04-12 12:05:31

标签: python bash environment-variables python-2.7

我编写了一个Python(2.7.2+)模块(称为TWProcessing),可以将其描述为一个临时批处理管理器。它的工作方式是我传递一长串命令,然后它将并行运行,但限制了同时进程的总数。这样,如果我想要运行500个命令,它将遍历所有这些命令,但是一次只运行它们的X,以免压倒机器。声明此批处理管理器的实例(该类称为TWBatchManager)时,可以轻松设置X的值:

batch = TWProcessing.TWBatchManager(MaxJobs=X)

然后我以非常直接的方式向此对象添加作业列表:

batch.Queue.append(/CMD goes here/)

其中Queue是批处理管理器将运行的命令列表。当队列填满后,我调用Run()循环遍历所有命令,一次只运行X:

batch.Run()

到目前为止,一切正常。现在我想要做的是能够动态地改变X的值(即一次运行的最大进程数),即在进程仍在运行时。我这样做的旧方式相当简单。我有一个名为MAXJOBS的文件,该类知道要查看,如果它存在,它将定期检查它以查看所需的值是否已更改。现在我想尝试一些更优雅的东西。我希望能够在启动包含批处理管理器的脚本的bash shell中编写export MAXJOBS=newX行的内容,并让批处理管理器意识到这现在应该是它应该使用的X的值。显然os.environ['MAXJOBS']不是我想要的,因为这是一个在启动时加载的字典。 os.getenv('MAXJOBS')也没有删除它,因为export只会影响shell从那时开始生成的子进程。所以我需要的是一种回到启动我的python脚本的父进程的环境的方法。我知道os.ppid会给我父pid,但我不知道如何从那里到达父环境。我在interwebz周围探查是否有一种方法可以让父shell修改子进程环境,我发现人们倾向于坚持我不会尝试这样的事情,以免我准备做一些用计算机可以做的最丑陋的事情。

关于如何解决此问题的任何想法?我认为“从标准文本文件中读取”的想法并不是那么难看,但我是Python的新手,因此我试图挑战自己,以优雅和干净的方式做事,尽可能多地学习。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

对我来说,看起来你要求bash脚本和python程序之间的进程间通信。

我不完全确定您的所有要求,但它可能是FIFO(命名管道)的候选者:

1)制作fifo:

mkfifo batch_control

2)启动python - server,它从fifo读取。 (注意:以下只是一个简约的例子;你必须适应:

while True:
    fd = file("batch_control", "r")
    for cmd in fd:
        print("New command [%s]" % cmd[:-1])
    fd.close()

3)从bash脚本中你可以通过echo将字符串'发送'到python服务器 - 将字符串输入到fifo中:

$ echo "newsize 800" >batch_control
$ echo "newjob /bin/ps" >batch_control

python服务器的输出是:

New command [newsize 800]
New command [newjob /bin/ps]

希望这有帮助。