Существует ли способ изменить эффективное имя процесса в Python?

Нет выбора. .NET Standard предназначен только для библиотек классов .NET. Это не среда выполнения, поэтому нельзя создавать приложения, нацеленные на нее. Средами выполнения являются .NET Core и .NET Full framework.

.NET Core - единственный кроссплатформенный вариант.

ASP.NET Core сам по себе является веб-стеком, который может работать в обеих средах выполнения. Вы можете выбрать тот, который вы хотите в диалоговом окне New Project.

Когда дело доходит до библиотек, выбор зависит от того, что нужно. Стандартные библиотеки .NET могут предназначаться для любой совместимой среды выполнения. Собственные библиотеки классов Razor в ASP.NET Core являются проектами .NET Standard 2.0. Большинство пакетов NuGet совместимы со стандартом .NET, чтобы избежать хлопот упаковки разных версий для каждой среды выполнения.

С другой стороны, последние функции, связанные с Span, появляются только в .NET Core 2.1 и более поздних версиях. Они недоступны в .NET Standard 2.0 , но они появятся в 2.1. Этот пример из All About Span: Изучение нового .NET Mainstay будет работать только в .NET Core 2.1+:

string input = ...;
ReadOnlySpan inputSpan = input;
int commaPos = input.IndexOf(',');
int first = int.Parse(inputSpan.Slice(0, commaPos));
int second = int.Parse(inputSpan.Slice(commaPos + 1));

74
задан Ned Batchelder 11 July 2010 в 20:52
поделиться

6 ответов

Проще говоря, нет никакого портативного пути. Необходимо будет протестировать на систему и использовать предпочтительный метод для той системы.

Далее, я смущен тем, что Вы подразумеваете под именами процесса в Windows.

Вы имеете в виду сервисное название? Я предполагаю так, потому что ничто иное действительно не имеет смысла (по крайней мере, к моему мозгу использования не-Windows).

Если так, необходимо использовать интерфейс WMI Tim Golden и назвать.Change метод на сервисе..., по крайней мере, согласно его учебное руководство .

Для Linux ни один из методов, которые я нашел работавшим за исключением этот плохо упакованный модуль , который устанавливает argv [0] для Вас.

я даже не знаю, будет ли это работать над вариантами BSD (который действительно имеет setproctitle системный вызов). Я - вполне уверенный argv [0], не будет работать над Солярисом.

13
ответ дан Van Gale 24 November 2019 в 11:57
поделиться

Во-первых, я не уверен, что просто настройки argv[0] в программе C портативно меняют имя, показанное в ps. Возможно, это делает в некотором unixen, но мое понимание - то, что это, как не ожидают.

1111-секундный, так как Windows является конкретно совместимый неPOSIX, только несколько вещей являются "портативными" между POSIX и неPOSIX. Так как Вы конкретно говорите 'PS', я предположу, что POSIX является Вашим приоритетом, и Windows не может работать.

, Что еще более важно, мое понимание изменения argv[0] - то, что оно требует, чтобы вызов к exec внес эти изменения. А именно, эти exec вызов имеет и путь к исполняемому файлу и отдельное argv список. Совершение Вашего собственного звонка позволяет Вам повреждать конвенцию оболочки того, чтобы ставить исполняемое имя в argv[0].

Вы имеете управление процессами библиотеки OS , который предоставляет Вам прямой доступ к библиотеке OS для того, чтобы сделать это. Необходимо рассмотреть повреждение сценария в две части - начинающий и "реальная работа". Начинающий устанавливает среду выполнения и должностное лицо реальная работа с желаемыми параметрами.

В C, Вы заменяете свой собственный процесс другим. В Python Вы заменяете старый интерпретатор Python новым, который имеет другой argv [0]. Хотелось бы надеяться, это не передумает относительно этого. Некоторые программы проверяют argv [0] для решения то, что они делают.

Вы также имеете subprocess.popen, который можно использовать для установки желаемого args и исполняемого файла. В этом случае, однако, родительский процесс должен задерживаться для сбора дочернего элемента, когда ребенок заканчивает. Родитель не может делать чего-то большего чем Popen.wait

4
ответ дан S.Lott 24 November 2019 в 11:57
поделиться
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

Примечание сингл '=' знак

-16
ответ дан Boris Gorelik 24 November 2019 в 11:57
поделиться

на самом деле вам нужно 2 вещи в linux: изменить argv [0] из C (для ps auxf и друзей) и вызовите prctl с флагом PR_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» :(. Но top и ps -A будут показать новое имя процесса 'testing yeah' :). Также killall и pkill будут работать с новым именем.

Кстати, procname из googlecode также изменяет argv [0] , таким образом, даже изменяется ] ps auxf output.

ОБНОВЛЕНИЕ : Решение, опубликованное в этом ответе, иногда не работает на FreeBSD. Сейчас я использую py-setproctitle , заявленный в этом ответе в течение года или около того на различных ящиках linux и freebsd. Пока нет сбоев! Всем тоже! :). Он использует почти тот же код, что и PostgreSQL использует в своей основной базе данных и дочерних процессах.

51
ответ дан 24 November 2019 в 11:57
поделиться

Недавно я написал модуль Python для изменения названия процесса переносимым способом: проверьте https://github.com/dvarrazzo/py-setproctitle

Это оболочка вокруг кода, используемого PostgreSQL для изменения заголовка. В настоящее время он протестирован на Linux и Mac OS X: Windows (с ограниченной функциональностью) и перенос BSD находятся в процессе.

Изменить: по состоянию на июль 2010 года модуль работает с BSD и с ограниченной функциональностью в Windows, и был перенесен на Python 3.x.

82
ответ дан 24 November 2019 в 11:57
поделиться

Посмотрите на setproctitle package

Это довольно портативная версия и работает на многих платформах.

pip install setproctitle

import setproctitle

setproctitle.setproctitle('new proc title as seen in top')
9
ответ дан 24 November 2019 в 11:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: