我可以更改Python脚本的有效进程名称吗?当我获取系统进程列表时,我想显示不同的名称而不是进程的真实名称。在C中我可以设置

strcpy(argv[0],"othername");

但在Python中

argv[0] = "othername"

似乎不起作用。当我得到进程列表时( ps ax 在我的linux机器中)真实姓名不会改变。我更喜欢便携式解决方案(或者一种针对 posix 的解决方案,另一种针对 Windows 环境的解决方案)(如果存在)。

提前致谢

有帮助吗?

解决方案

简单地说,有没有可移植的方法。你必须以测试系统,并使用优选的方法该系统。

此外,我很困惑你在Windows的意思进程名称是什么。

你的意思是一个服务名称?我相信这样的,因为没有别的真正使任何意义(至少我的非Windows使用大脑)。

如果是这样,你需要使用添金的WMI接口和调用.Change方法服务......至少根据他教程

有关的Linux都不除了此包装很差模块我发现工作的方法的该套的argv [0]为您服务。

我甚至不知道这是否会在BSD变体的工作(这确实有一个使用setproctitle系统调用)。我敢肯定的argv [0]将不会在Solaris上运行。

其他提示

我最近写的一个Python模块更改流程标题在便携方式:检查 HTTPS:/ /github.com/dvarrazzo/py-setproctitle

有周围使用的PostgreSQL执行标题变化的代码的包装。它目前正在测试针对Linux和Mac OS X:视窗(具有有限的功能)和BSD portings在途中

编辑: 2010年7月,该模块与BSD及Windows功能有限,并且已经被移植到Python 3.x的

实际上你在linux上需要两件事:调整 argv[0]C (为了 ps auxf 和朋友)并致电 prctlPR_SET_NAME 旗帜。

绝对没有办法从 python 本身做第一部分。不过,您可以通过调用 prctl 来更改进程名称。

def set_proc_name(newname):
    from ctypes import cdll, byref, create_string_buffer
    libc = cdll.LoadLibrary('libc.so.6')
    buff = create_string_buffer(len(newname)+1)
    buff.value = newname
    libc.prctl(15, byref(buff), 0, 0, 0)

def get_proc_name():
    from ctypes import cdll, byref, create_string_buffer
    libc = cdll.LoadLibrary('libc.so.6')
    buff = create_string_buffer(128)
    # 16 == PR_GET_NAME from <linux/prctl.h>
    libc.prctl(16, byref(buff), 0, 0, 0)
    return buff.value

import sys
# sys.argv[0] == 'python'

# outputs 'python'
get_proc_name()

set_proc_name('testing yeah')

# outputs 'testing yeah'
get_proc_name()

ps auxf 之后将仅显示“python”:(。但 topps -A 将显示新的“testing yes”进程名称:)。还 killallpkill 将使用新名称。

顺便说一句,来自 googlecode 的 procname 也发生了变化 argv[0], ,因此,甚至改变 ps auxf 输出。

更新:这个答案中发布的解决方案有时在 FreeBSD 上效果不佳。我现在正在使用 py-setproctitle 指出 在这个答案中 在各种 linux 和 freebsd 机器上花了一年左右的时间。目前还没有失败!大家也应该如此!:)。它使用几乎相同的代码 PostgreSQL 用途 在其主数据库和子进程中。

使用setproctitle 封装的外观

这是一个相当便携版本,适用于多种平台。

首先,我不知道,仅仅设置argv[0]在C程序可移植性改变ps显示的名称。也许它在一些unixen,但我的理解是,它没有预料到了。

其次,由于视窗具体非POSIX兼容,只有几件事情是POSIX和非POSIX之间“便携式”。既然你说具体“PS”,我假设POSIX是你的优先和Windows可能无法正常工作。

更重要的是,我的改变argv[0]的理解是,它需要一个电话exec进行这些改变。具体而言,exec呼叫既具有到可执行的路径和一个单独的argv列表。制作自己的呼叫,可以打破把可执行文件名中argv[0]的外壳约定。

您有 OS库流程管理,让你直接访问在OS库这样做。你应该考虑将你的脚本分为两个部分 - 起动器和“真正的工作”。起动建立运行时环境和exec与所需参数的实际工作。

在C,你与另一个替换自己的过程。在Python中,你有一个新的,具有不同的argv [0]替换旧的Python解释器。但愿它不会在这个在所不惜。有些程序检查的argv [0]来决定他们在做什么。

您还可以 subprocess.popen ,你可以用它来设置所需的指定参数和可执行文件。在这种情况下,然而,父进程应该不散各地收集孩子当孩子完成。母体也可以不执行任何操作多于一个Popen.wait

我已经发现蟒-使用prctl 以很好地工作在Linux下。你必须找到为Windows别的东西。

In [1]: import sys

In [2]: print sys.argv[0]
C:\Python25\scripts\ipython.py

In [3]: sys.argv[0] = 'foo'

In [4]: print sys.argv[0]
foo

请注意单个 '=' 符号

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top