【问题标题】:Re-read environment of parent process in python在python中重新读取父进程的环境
【发布时间】:2012-04-12 12:05:30
【问题描述】:

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

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 新手,因此我试图挑战自己以优雅和干净的方式做事,尽可能多地学习。提前感谢您的帮助。

【问题讨论】:

    标签: python bash environment-variables python-2.7


    【解决方案1】:

    对我来说,您似乎要求在 bash 脚本和 python 程序之间进行进程间通信。

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

    1) 制作先进先出:

    mkfifo batch_control
    

    2) 启动 python - 服务器,它从 fifo 读取。 (注意:以下只是一个简单的例子;你必须适应一些东西:

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

    3) 从 bash 脚本中,您可以通过 echo-ing 将字符串“发送”到 python 服务器到 fifo:

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

    python服务器的输出是:

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

    希望这会有所帮助。

    【讨论】:

    • 非常感谢您的回答。我考虑过 FIFO,它们确实是一个很好的解决方案,如果我这样做,你的回答将对我有很大的帮助。不过,一位同事建议使用套接字,这对于我想到的其他一些应用程序也非常有用。不过别担心,我会坚持你的答案,当我最终开始使用 FIFO 时,这对我非常有用。再次感谢:)
    • 我也想过使用套接字。套接字的优点是,它们也可以在不同的服务器之间使用——FIFO 只能在一台服务器上使用。套接字的缺点是,它需要更多的精力来处理来自 bash 脚本的事情。
    • 确实如此,但这个小项目的重点主要在于学习和挑战自己。还有一些我很想尝试用套接字做的事情,特别是考虑到我被证明可以做的事情。所以我认为现在我会和他们一起去。
    • FIFO 和 AF_UNIX 套接字几乎可以互换(由于愚蠢的 POSIX 事物而产生了轻微的烦恼)。如果你愿意,你可以设置你的 python 代码来使用这两者。请注意,如果您开始使用跨机套接字(AF_INET 等),您会突然遇到安全问题;出于安全目的,使用文件系统实体(fifos 和AF_UNIX 套接字)允许您构建文件系统权限。听起来您确实很开心并且学习了很多东西! :-)
    • 仅供参考:我已经使用了套接字,并且此时几乎已经构建了一个虚拟批处理服务器。现在享受调整和打磨它的乐趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2017-11-07
    • 2016-10-20
    • 2015-09-21
    • 2012-03-10
    相关资源
    最近更新 更多