Вы никогда не будете free()
памятью, что вы не malloc()
ed.
Способ, которым компилятор реализует строковые литералы, не является вашим бизнесом: это деталь реализации. Вы можете free()
указатель на память, который вы выделили с помощью malloc()
, и только те, или вы рискуете жизнью своей системы.
В идеале, вызовы malloc()
и free()
вызовы должны отображаться на одном и том же «уровне проектирования» (внутри одного и того же файла реализации для того же модуля, например), и они должны идеально соответствовать: один free()
для каждого malloc()
. но это не всегда возможно.
(Обратите внимание, что некоторая библиотека выделяет блоки памяти, возвращает указатели на эти блоки и инструктирует их освобождать их. В этом случае вам разрешено освобождать эти указатели , но это плохая практика проектирования от людей, которые создали библиотеку.)
import psutil
process = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter())
for i in process:
print i.name,i.pid
Дайте все pids «YourProcess.exe»
Для jython, если используется Java 5, вы можете получить идентификатор процесса Java следующим образом:
из java.lang.management import * pid = ManagementFactory.getRuntimeMXBean (). getName ()
Замечание к комментарий ThorSummoner
process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"].
Я пробовал его на Debian с Python 3, я думаю, что он должен быть proc.name()
вместо proc.name
.
Я не думаю, что вы сможете найти чисто портативное решение на основе python без использования / proc или утилит командной строки, по крайней мере, не в самом python. Парсинг os.system не уродлив - кто-то должен иметь дело с несколькими платформами, будь то вы или кто-то еще. Реализация этого для ОС, которую вы заинтересованы, должна быть довольно простой, честно.
Нет единого межплатформенного API, вам нужно будет проверить наличие ОС. Для использования на основе posix / proc. Для Windows используйте следующий код, чтобы получить список всех pids с соответствующими именами процессов
from win32com.client import GetObject
WMI = GetObject('winmgmts:')
processes = WMI.InstancesOf('Win32_Process')
process_list = [(p.Properties_("ProcessID").Value, p.Properties_("Name").Value) for p in processes]
. Затем вы можете легко отфильтровывать процессы, которые вам нужны. Для получения дополнительной информации о доступных свойствах Win32_Process проверьте класс Win32_Process
pywin32
пакет со сборками sourceforge.net/projects/pywin32/files/pywin32 , ответ должен был включить этот
– n611x007
20 February 2015 в 14:36
Во-первых, Windows (во всех ее воплощениях) является нестандартной ОС.
Linux (и большинство проприетарных unixen) являются стандартными операционными системами, совместимыми с POSIX.
The C библиотеки отражают эту дихотомию. Python отображает библиотеки C.
Для этого не существует «кросс-платформенного» способа. Вы должны взломать что-то с помощью ctypes для определенной версии Windows (XP или Vista)
Боюсь, нет. Процессы уникально идентифицируются pid не по имени. Если вы действительно должны найти pid по имени, тогда вы будете использовать что-то вроде того, что предложили, но оно не будет переносимым и, вероятно, не будет работать во всех случаях.
Если вам нужно только найти pids для определенного приложения, и у вас есть контроль над этим приложением, тогда я бы предложил изменить это приложение, чтобы сохранить его pid в файлах в каком-то месте, где ваш скрипт может его найти.
process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"]
. – ThorSummoner 6 February 2015 в 18:57