Как я могу перечислить все процессы, работающие в Windows?

Примечание: это была ошибка в обработке CPython для yield в выражениях выражений и выражений генератора, исправленных в Python 3.8, с предупреждением об отказе в Python 3.7. Смотрите отчет об ошибках Python и записи What's New для Python 3.7 и Python 3.8 .

Выражения генератора, а также функции set и dict компилируются в объекты функции (генератора). В Python 3 переписные справки получают одинаковое обращение; все они, по существу, представляют собой новую вложенную область.

Вы можете увидеть это, если попытаетесь разобрать выражение генератора:

>>> dis.dis(compile("(i for i in range(3))", '', 'exec'))
  1           0 LOAD_CONST               0 ( at 0x10f7530c0, file "", line 1>)
              3 LOAD_CONST               1 ('')
              6 MAKE_FUNCTION            0
              9 LOAD_NAME                0 (range)
             12 LOAD_CONST               2 (3)
             15 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             18 GET_ITER
             19 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             22 POP_TOP
             23 LOAD_CONST               3 (None)
             26 RETURN_VALUE
>>> dis.dis(compile("(i for i in range(3))", '', 'exec').co_consts[0])
  1           0 LOAD_FAST                0 (.0)
        >>    3 FOR_ITER                11 (to 17)
              6 STORE_FAST               1 (i)
              9 LOAD_FAST                1 (i)
             12 YIELD_VALUE
             13 POP_TOP
             14 JUMP_ABSOLUTE            3
        >>   17 LOAD_CONST               0 (None)
             20 RETURN_VALUE

Вышеприведенное показывает, что выражение генератора скомпилированный в объект кода, загруженный как функция (MAKE_FUNCTION создает объект функции из объекта кода). Ссылка .co_consts[0] позволяет нам видеть объект кода, сгенерированный для выражения, и использует YIELD_VALUE так же, как функция генератора.

Таким образом, выражение yield работает в этом контексте, поскольку компилятор рассматривает их как скрытые функции.

Это ошибка; yield не имеет места в этих выражениях. Python грамматика до Python 3.7 позволяет (поэтому код компилируется), но спецификация выражения yield показывает, что использование yield здесь не должно действительно работать :

Выражение yield используется только при определении функции generator и, следовательно, может использоваться только в теле определения функции.

blockquote >

Это было подтверждено как ошибка в выпуске 10544 . Разрешение ошибки заключается в том, что с помощью yield и yield from будет поднять SyntaxError в Python 3.8 ; в Python 3.7 он вызывает DeprecationWarning , чтобы гарантировать, что код перестает использовать эту конструкцию. Вы увидите то же предупреждение в Python 2.7.15 и выше, если вы используете переключатель командной строки -3 , включающий предупреждения о совместимости с Python 3.

Появляется предупреждение 3.7.0b1 как это; включение предупреждений в ошибки дает вам исключение SyntaxError, как и в 3.8:

>>> [(yield i) for i in range(3)]
:1: DeprecationWarning: 'yield' inside list comprehension
 at 0x1092ec7c8>
>>> import warnings
>>> warnings.simplefilter('error')
>>> [(yield i) for i in range(3)]
  File "", line 1
SyntaxError: 'yield' inside list comprehension

. Различия между тем, как yield в понимании списка и yield в выражении генератора работают, вытекают из различия в том, как эти два выражения реализованы. В Python 3 в понимании списка используются вызовы LIST_APPEND, чтобы добавить верхнюю часть стека в построенный список, в то время как выражение генератора вместо этого дает это значение. Добавление в (yield ) просто добавляет еще один код операции YIELD_VALUE:

>>> dis.dis(compile("[(yield i) for i in range(3)]", '', 'exec').co_consts[0])
  1           0 BUILD_LIST               0
              3 LOAD_FAST                0 (.0)
        >>    6 FOR_ITER                13 (to 22)
              9 STORE_FAST               1 (i)
             12 LOAD_FAST                1 (i)
             15 YIELD_VALUE
             16 LIST_APPEND              2
             19 JUMP_ABSOLUTE            6
        >>   22 RETURN_VALUE
>>> dis.dis(compile("((yield i) for i in range(3))", '', 'exec').co_consts[0])
  1           0 LOAD_FAST                0 (.0)
        >>    3 FOR_ITER                12 (to 18)
              6 STORE_FAST               1 (i)
              9 LOAD_FAST                1 (i)
             12 YIELD_VALUE
             13 YIELD_VALUE
             14 POP_TOP
             15 JUMP_ABSOLUTE            3
        >>   18 LOAD_CONST               0 (None)
             21 RETURN_VALUE

Код операции YIELD_VALUE в индексах байт-кода 15 и 12 соответственно является дополнительным, кукушкой в ​​гнезде. Таким образом, для генератора, использующего список, вы получаете 1 выход, каждый раз производя верхнюю часть стека (заменяя верхнюю часть стека на возвращаемое значение yield), а для варианта выражения генератора вы получаете верхнюю часть stack (целое число), а затем снова , но теперь стек содержит возвращаемое значение yield, и вы получите None второй раз.

Для списка тогда предполагается, что предполагаемый вывод объекта list все еще возвращен, но Python 3 рассматривает это как генератор, поэтому вместо этого значения возврата StopIteration в качестве атрибута value добавляется возвращаемое значение:

>>> from itertools import islice
>>> listgen = [(yield i) for i in range(3)]
>>> list(islice(listgen, 3))  # avoid exhausting the generator
[0, 1, 2]
>>> try:
...     next(listgen)
... except StopIteration as si:
...     print(si.value)
... 
[None, None, None]

Те None объекты - это возвращаемые значения из выражений yield.

И повторить это снова; эта же проблема относится к словарю и устанавливает понимание в Python 2 и Python 3; в Python 2 возвращаемые значения yield все еще добавляются к предполагаемому словарю или заданному объекту, а возвращаемое значение «дано» последнему вместо привязки к исключению StopIteration:

>>> list({(yield k): (yield v) for k, v in {'foo': 'bar', 'spam': 'eggs'}.items()})
['bar', 'foo', 'eggs', 'spam', {None: None}]
>>> list({(yield i) for i in range(3)})
[0, 1, 2, set([None])]
28
задан Statement 15 March 2009 в 19:44
поделиться

6 ответов

Нахождение всех процессов

можно ли сделать это через класс

using System.Diagnostics;
...
var allProcesses = Process.GetProcesses();

Процесса Запуск диагностики

, можно ли дать нам еще некоторую информацию здесь? Не ясно, что Вы хотите сделать.

класс Процесса предоставляет немного информации, хотя это могло бы выручить Вас. Возможно запросить этот класс для [1 113]

  • Все потоки
  • Дескриптор Главного окна
  • Все загруженные модули
  • Различная диагностическая информация о Памяти (Разбитый на страницы, Виртуальный, Рабочий набор, и т.д....)
  • информация о Базовом процессе (идентификатор, имя, дисковое местоположение)

РЕДАКТИРОВАНИЕ

, OP упомянула, что они хотят получить информация о ЦП и память. Эти свойства легко доступны на классе Процесса (возвращенный GetProcesses ()). Ниже страница MSDN, которая перечисляет все поддерживаемые свойства. Существует различная память и ЦП, доступные, который будет комплект Ваши потребности.

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

Код:

Добавляют эту строку к Вашему списку использования:

using System.Diagnostics;

Теперь можно получить список процессов с Процессом. GetProcesses () метод, как замечено в этом примере:

Process[] processlist = Process.GetProcesses();

foreach (Process theprocess in processlist)
{
    Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, theprocess.Id);
}
72
ответ дан wip 14 October 2019 в 09:45
поделиться

На самом деле найти все процессы довольно просто:

using System.Diagnostics;

Process[] processes = Process.GetProcesses();

foreach (Process process in processes)
{
    // Get whatever attribute for process.
}
8
ответ дан Uwe Keim 14 October 2019 в 09:45
поделиться

JaredPar уже указал Process класс, таким образом, я просто добавлю, что необходимо знать, что класс берет снимок информации процесса, когда экземпляр создается. Это не предпросмотр в реальном времени. Для обновления его, необходимо звонить Refresh() на экземпляре.

Также имеют в виду, что процесс может закрыться при осмотре его, так быть готовыми поймать исключения и обработать их соответственно.

И наконец если Вы звоните Process.GetProcesses(), Вы также получите псевдо "неактивные" процессы и "система". IIRC у них есть определенные идентификаторы процесса, таким образом, можно легко фильтровать их.

4
ответ дан Brian Rasmussen 14 October 2019 в 09:45
поделиться

Какую операционную систему вы используете? Я понял из вашего тега C #, что это windows?

Если это так, проверьте WMI, особенно класс Win32_Process. Вот ссылка на MSDN: http://msdn.microsoft.com/en-us/library/aa394372 (VS.85) .aspx

, а также пара сценариев использования здесь (например, получение списка процессов): http://msdn.microsoft.com/en-us/library/aa394599 (VS.85) .aspx

0
ответ дан CapBBeard 14 October 2019 в 09:45
поделиться
using System.Diagnostics;

class Program
{
   static void Main()
   {   
      Process[] processlist = Process.GetProcesses();`          
   }
}

здесь массив процессов содержит все количество процессов, присутствующих в нем.

0
ответ дан Abdelilah El Aissaoui 14 October 2019 в 09:45
поделиться

Хорошо можно сделать это в powershell

1. Нахождение всех процессов

get-Process 

2. Нахождение диагностики приписывает о них

get-Process | where-object { $_.Handles -gt 200 }

Вышеупомянутый код возвратит все процессы с более чем 200 дескрипторами, можно указать диагностические атрибуты этим способом легко.

Для получения дополнительной информации о том, как обработать процессы с помощью powershell, посмотрите это

0
ответ дан Binoj Antony 28 November 2019 в 00:49
поделиться
Другие вопросы по тегам:

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