Python 不允许操作os.setsid

Python 不允许操作os.setsid,python,django,debian,system,Python,Django,Debian,System,好吧,请耐心听我说,谷歌上似乎有一些关于这个问题的答案,但我就是找不到 我在Django芹菜环境中用两个叉子来运行它。我不知道这些是否能改变什么,但我想他们没有 作为一个强大的团队,没有多少代码可以留下 if __name__ == '__main__': os.setsid() 允许我做不允许的漂亮手术 我正在运行最新的稳定的Django、Debian、Celery和Python版本。Python的os.setsid()可能调用底层库调用setsid(3) man 3 setsid中

好吧,请耐心听我说,谷歌上似乎有一些关于这个问题的答案,但我就是找不到

我在Django芹菜环境中用两个叉子来运行它。我不知道这些是否能改变什么,但我想他们没有

作为一个强大的团队,没有多少代码可以留下

if __name__ == '__main__':
    os.setsid()
允许我做不允许的漂亮手术

我正在运行最新的稳定的Django、Debian、Celery和Python版本。

Python的
os.setsid()
可能调用底层库调用
setsid(3)

man 3 setsid
中的完整错误部分是:

ERRORS
   EPERM  The  process group ID of any process equals the PID of the call-
          ing process.  Thus, in particular, setsid() fails if the calling
          process is already a process group leader.
IOW:setId()失败的唯一原因是调用进程已经是进程组组长。因此,你可以忽略失败。要验证情况是否属实,请比较
os.setsid()
失败时从
getpid()
getpgid()
获得的结果:

#!/usr/bin/env python

import os
import errno

if __name__ == '__main__':
    try:
        os.setsid()
    except OSError, (err_no, err_message):
        print "os.setsid failed: errno=%d: %s" % (err_no, err_message)
        print "pid=%d  pgid=%d" % (os.getpid(), os.getpgid(0))
当我运行上述程序时,我得到:

os.setsid failed: errno=1: Operation not permitted
pid=17025  pgid=17025
请注意,流程id(pid)等于流程组id(pgid),这意味着此流程实际上已经是流程组组长


附言:是的,python的一个令人费解的特性是在一个简单的错误返回代码足以区分成功和失败的情况下引发异常(就像熟悉的Un*x
libc
API)。不幸的是,python系统调用接口就是这样实现的,因此您需要使用
try:except…:
构造来包装许多系统调用,以防止python中止您的代码。

您的示例不起作用,因为“如果调用进程已经是进程组组长,则setId()将失败”(参见手册页setId(2))中的“不允许操作”。但这并不能回答您的问题,因为在fork(2)之后,您不再是流程组长。